Настройки IBOutlets равны нулю в dealloc
В разделе под названием "предупреждения памяти" здесь http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html, я не понимаю, почему IBOutlet установлен на ноль в dealloc. Если
self.anOutlet = nil
Вызывает сбой как упоминалось в теме, Почему они устанавливают Ивар равным нулю?
В общем, зачем вам устанавливать Ивар равным нулю в dealloc, когда вы уже вызываете release?
4 ответа:
После
Пример, на который вы ссылаетесь, просто демонстрирует, почему всегда лучше установить переменную или ivar вrelease
указатель по существу недействителен, и повторный доступ к нему может привести к сбою. Установив переменную вnil
послеrelease
, вы предотвратите этот сбой. Нет никакого вреда в доступе к нулевому указателю.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 для этого свойства. Если аннулирование происходит в суперклассе, то эта ошибка скрыта и довольно неприятна. Поэтому всякий раз, когда суперкласс может аннулировать свойство, может быть хорошей идеей установить его равным нулю, а не просто разгрузка.