Просмотр выпуска контроллера перед возвратом делегата - PullRequest
0 голосов
/ 22 апреля 2011

У меня проблема.Контроллер моего представления (ViewController) реализует метод делегирования объекта (DataPuller, данные получают из Интернета).DataPuller будет извлекать данные в Интернете, не блокируя взаимодействие пользователя с представлением.Но когда я перемещаюсь между экранами, в некоторых случаях этот ViewController выпускается раньше, чем DataPuller возвращает список объектов.Возвращает DataPuller, он проверяет:

if (delegate && [delegate respondsToSelector:@selector(getCommentDidDownloadFinish:)]) {
    [self.delegate performSelector:@selector(getCommentDidDownloadFinish:) withObject:self];
}

И здесь происходит сбой приложения, потому что релиз ViewController становится объектом-зомби.У кого-нибудь была эта проблема раньше и как ее решить?Я думаю, что другой способ использует NSNotification, но мне интересно, какие-либо другие лучшие решения.Любые идеи, решения приветствуются.Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Ваш контроллер представления должен в какой-то момент удалить себя как делегат DataPuller.Обычно это обрабатывается в методе dealloc:

- (void)dealloc {
     dataPuller.delegate = nil;
     [dataPuller release];
     [super dealloc];
}

Вы также можете решить сделать это в -viewDidUnload или -viewDidDisappear:

1 голос
/ 22 апреля 2011

Делегирование (обычно) подразумевает какое-то владение - то есть, если вы делаете объект делегатом другого объекта, обычно объект делегата содержит строгую ссылку (то есть сохраняет объект делегирования).

В качестве примера, UITableViewController является делегатом своего UITableView. Это нормально, потому что контроллер сохраняет представление таблицы через свойство view.

Если ваш дизайн не позволяет владеть, используйте уведомления, как вы уже предложили. В качестве бонуса уведомления могут сигнализировать нескольким слушателям, если вам это когда-нибудь понадобится.

Не забудьте убрать своего наблюдателя из списка контроллеров вида!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...