Взято из моего сообщения в блоге здесь: http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/
Вам нужно будет уделить дополнительное внимание объекту делегата, поскольку для NSURLConnection
существует особое внимание для делегата: он всегда сохраняется.
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG
initWithRequest: делегат :
Особые замечания :
Соединение сохраняет
делегировать. Это освобождает делегата, когда
соединение завершает загрузку,
не выполняется или отменяется.
Итак, учитывая это, у вас есть несколько вариантов, чтобы ваш делегат был выпущен правильно, и я попытаюсь объяснить 2 простых.
Первый и наиболее часто используемый - это использование того же класса, который инициализирует NSURLConnection, что и делегат.
[[NSURLConnection alloc] initWithRequest:request self];
Таким образом, ваш класс хранения будет увеличен на 1 при запуске подключения, а затем уменьшен на 1 после завершения загрузки, сбоя или отмены подключения, что не приведет к утечкам памяти.
Второй вариант, который вы пытаетесь сделать, - это использовать другой объект для обработки всех вызовов соединения. Это также хорошо работает, но вам потребуется дополнительное внимание с памятью. Одна простая вещь, которую вы можете сделать, чтобы решить свою проблему, - это инициализировать соединение с помощью объекта автоматического выпуска.
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler as an autorelease object
[[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];
ИЛИ вы можете освободить ваш обработчик сразу после создания соединения (так как оно уже будет сохранено соединением)
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler
[[NSURLConnection alloc] initWithRequest:request delegate:handler];
//releases handler object
[handler release];
В обоих случаях владение объектом-обработчиком остается только с классом соединения, который освобождает объект-обработчик сразу после завершения загрузки, сбоя или отмены, что снова не приводит к утечкам памяти.
РЕДАКТИРОВАТЬ: выполнив любой из вышеперечисленных вариантов, вам не нужно беспокоиться об освобождении делегата (но вы все равно должны освободить соединение) в методах connection:DidFinishLoading
и connection:didFailWithError
.