Присвоение делегату значения nil при освобождении

#objective-c #xcode #delegates #instance-variables #dealloc

#objective-c #xcode #делегаты #переменные экземпляра #освободить

Вопрос:

В Objective-C я понимаю, что если объект устанавливает себя в качестве делегата другого объекта, он должен установить для делегата этого объекта значение nil в своем dealloc , чтобы избежать получения отправленных сообщений после его удаления.

Однако при использовании Accessorizer (утилиты Xcode) генерируемый им код-заглушка также помещает delegate = nil в dealloc класса, который имеет переменную экземпляра делегата. Какова цель этого?

Ответ №1:

Это защитный программный ход. Это удаление ссылки на объект делегата, если что-то еще в вашем объекте пытается получить доступ к делегату после того, как вы сообщили ему, что закончили с ним. В рамках вашего dealloc у вас может быть метод или что-то еще, что запускает уведомление KVO, вызывающее делегат. Таким образом, присвоение ссылке делегата значения nil предотвращает это. Если бы это произошло, вы могли бы столкнуться с некоторыми странными сбоями, которые интересно воспроизвести и исправить.