Должен ли я иметь нулевые ссылки на делегаты, сделанные через Interface Builder? - PullRequest
2 голосов
/ 12 февраля 2010

Если я назначаю свойство делегата из classB для classA из Interface Builder, я должен назначить IBOutlet для classB, а затем в classA dealloc установить для делегата значение nil через выход? (Предполагая, что classA является владельцем файла XIB ...)

1 Ответ

4 голосов
/ 12 февраля 2010

Краткий ответ: да.

Независимо от того, использовали ли вы Interface Builder или нет, рекомендуется, чтобы делегат удалял себя как делегат делегирующего объекта, как только он отказывается от владения (то есть освобождает) делегирующий объект. Это может быть как минимум в методе dealloc, но также может происходить и в более ранней точке.

Причина: обычно делегат является своего рода родительским объектом делегирующего объекта. Очень часто делегат и владелец делегирующего объекта - это один и тот же объект. Поскольку родительский объект обычно сохраняет дочерний объект, во избежание циклических ссылок делегирующий (то есть дочерний) объект обычно не сохраняет свой делегат. В этих случаях может случиться так, что объект делегата будет освобожден, пока делегирующий объект еще жив (если какой-то другой объект также сохранил его). Если теперь делегирующий объект пытается получить доступ к своему делегату (который больше не существует), программа может аварийно завершить работу.

Таким образом, непосредственно перед тем, как родительский объект освобождает свой дочерний объект (обычно, но не всегда, в своем методе dealloc), он должен вызвать childObject.delegate = nil;.

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