Я слежу за этот полезный ответ на мой вопрос.
Вроде работает, но у меня есть два вопроса:
Обновлено:Считает успехом любой ответ. Итак, я предполагаю, что мне нужно обрабатывать HTTP-ошибки в методе didRecieveResponse, но, помимо сообщения пользователю об ошибке, когда я нажимаю HTTP-ошибку, нужно ли мне каким-то образом останавливать соединение? И / или уборка?
[[NSURLConnection alloc] initWithRequest:request delegate:self];
Мне нужно выпустить это? Где, как и когда?





Да, вам нужно освободить этот объект. См. Руководство по программированию управления памятью для какао. По сути, если вы когда-либо создаете объект с именем метода, которое начинается с alloc или new или содержит copy, вы становитесь владельцем объекта и несете ответственность за его освобождение позже. Только в том случае, если вы знаете, что объект вам понадобится до завершения программы, можно не освобождать его, и в этом случае операционная система освобождает память после завершения работы вашего приложения.
Если вам нужен только объект в небольшой области, вы можете отправить ему сообщение autorelease. Это добавит его в пул автозапуска. Пул с автоматическим выпуском периодически отправляет сообщение release каждому объекту в нем. Это довольно сложно; см. раздел о пулы с автоматическим выпуском. Например:
Однако в этом случае, поскольку NSURLConnection асинхронны, автоспуск не будет работать. Вы не знаете точно, когда он обратится к вашему объекту с данными, поэтому вы хотите убедиться, что объект еще не выпущен. Единственный способ быть уверенным - это точно знать, когда вы закончили с объектом, а затем отправить ему сообщение release самостоятельно.
Все различные функции init* возвращают указатель на данный объект, поэтому вы можете просто сделать:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
...
// when done with connection:
[connection release];
Вы получите код статуса, возвращенный в didReceiveResponse.
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSHTTPURLResponse *httpResponse;
httpResponse = (NSHTTPURLResponse *)response;
int statusCode = [httpResponse statusCode];
//statusCode will be the http code returned like 201,500
}
Чтобы остановить соединение, используйте для соединения переменную уровня класса. Лучший способ сделать это - создать оболочку, которая отправляет запросы и получает ответ. Сделайте свой viewcontroller делегатом этого класса, и всякий раз, когда didReceiveResponse выдает код состояния ошибки, вызовите соответствующий метод делегата и остановите соединение.
Вот хороший пример класса-оболочки
Отвечая на вопрос в вашем "обновлении" ...
Немедленно автоматически освободите NSURLConnection. Объект подключения сохраняется в NSRunLoop (к которому он добавляется автоматически, если вы не используете конструктор startImmediately: NO). Он будет автоматически удален из цикла выполнения (и, следовательно, освобожден) при ошибке или завершении.
Это то, о чем я думал. Я не понимаю, как его выпустить, если у него нет названия?