Настройки IBOutlets равны нулю в dealloc


В разделе под названием "предупреждения памяти" здесь http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html, я не понимаю, почему IBOutlet установлен на ноль в dealloc. Если

self.anOutlet = nil

Вызывает сбой как упоминалось в теме, Почему они устанавливают Ивар равным нулю?

В общем, зачем вам устанавливать Ивар равным нулю в dealloc, когда вы уже вызываете release?

4 8

4 ответа:

После release указатель по существу недействителен, и повторный доступ к нему может привести к сбою. Установив переменную в nil после release, вы предотвратите этот сбой. Нет никакого вреда в доступе к нулевому указателю.

Пример, на который вы ссылаетесь, просто демонстрирует, почему всегда лучше установить переменную или ivar в nil после release, даже если кажется, что переменная/ivar больше не будет доступна.

В этом примере к Ивару anOutlet фактически обращается суперкласс после вашего метода dealloc, поэтому, если вы не установите его равным нулю, вы получите сбой. Подобные сценарии очень трудно обнаружить, просто взглянув на код, поэтому неплохо свести к нулю каждую переменную после выпуска, даже в dealloc.

Отправка сообщения на освобожденный объект вызывает сбой, отправка сообщения на нулевой объект игнорируется.

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

Книга Рецепты iOS относится к этому вопросу:

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

Быстрый поиск в google нашел это thread:
http://www.cocoabuilder.com/archive/cocoa/204055-why-should-we-set-ivars-to-nil-in-dealloc.html

Иногда, когда одно свойство становится недействительным (равным нулю), мы хотим сделать недействительными и другие свойства. Если класс объявляет свойство с помощью собственной.property_name=nil, то это отправит сообщение release, которое вызовет сбой в dealloc, если мы уже вызвали release для этого свойства. Если аннулирование происходит в суперклассе, то эта ошибка скрыта и довольно неприятна. Поэтому всякий раз, когда суперкласс может аннулировать свойство, может быть хорошей идеей установить его равным нулю, а не просто разгрузка.