Освободить слушателя / наблюдателя в Objective-C? - PullRequest
0 голосов
/ 16 октября 2010

Я не уверен, когда это подходящий момент, чтобы ВЫПУСТИТЬ объект слушателя.

У меня есть объект A, который использует метод initWithRequest NSURLConnection для получения некоторого URL. initWithRequest требует, чтобы делегат слушал после событий dataReceived ... Таким образом, объект A создает объект B и передает его в качестве делегата для метода initWithRequest.

Когда данные извлекаются из сети, вызывается метод объекта B. После того, как объект B завершил свою работу, кто отвечает за освобождение объекта B?!?

Подвести итоги:

объект A создает объект B и делает его слушателем какого-либо события. Событие происходит, и объект B выполняет свою работу. После того, как объект B выполнил свою работу, кто отвечает за его освобождение?!?

ОБРАТИТЕ ВНИМАНИЕ Есть много вопросов и ответов о том, как удалить Observers в Objective-C. В любом случае, я обнаружил, что все они используют шаблон KVO.

Ответы [ 2 ]

1 голос
/ 16 октября 2010

Вы пытались сделать так, чтобы объект B высвобождал себя в методе «завершено получение данных»? Это, казалось бы, конец его полезной жизни. Или вы можете сохранить ссылку на него в объекте A, а затем освободить его в методе dealloc объекта A.

0 голосов
/ 16 октября 2010

Согласно справочнику NSURLConnection :

Соединение сохраняет делегата. Это освобождает делегата, когда соединение завершает загрузку, выходит из строя или отменен.

NSURLConnection является исключением в этом отношении - большинство объектов не сохраняют своих делегатов.

Таким образом, в этом случае объект A должен сохранить объект B, если A хочет продолжать использовать B, и в этом случае он должен освободить его по завершении; NSURLConnection позаботится о собственном использовании B.

...