#objective-c #xcode #delegates #instance-variables #dealloc
#objective-c #xcode #делегаты #переменные экземпляра #освободить
Вопрос:
В Objective-C я понимаю, что если объект устанавливает себя в качестве делегата другого объекта, он должен установить для делегата этого объекта значение nil
в своем dealloc
, чтобы избежать получения отправленных сообщений после его удаления.
Однако при использовании Accessorizer (утилиты Xcode) генерируемый им код-заглушка также помещает delegate = nil
в dealloc
класса, который имеет переменную экземпляра делегата. Какова цель этого?
Ответ №1:
Это защитный программный ход. Это удаление ссылки на объект делегата, если что-то еще в вашем объекте пытается получить доступ к делегату после того, как вы сообщили ему, что закончили с ним. В рамках вашего dealloc у вас может быть метод или что-то еще, что запускает уведомление KVO, вызывающее делегат. Таким образом, присвоение ссылке делегата значения nil предотвращает это. Если бы это произошло, вы могли бы столкнуться с некоторыми странными сбоями, которые интересно воспроизвести и исправить.