2010-05-16 3 views
7

уточняющий вопрос, как следовать до:Последующие viewDidUnload против dealloc вопрос

What exactly must I do in viewDidUnload? When should I release objects in -(void)viewDidUnload rather than in -dealloc?

Так скажем, есть низкая ошибка памяти, и вид скрыт, и viewDidUnload называется. Мы делаем выпуск и ноль танцуем. Позже весь стек представления не нужен, поэтому вызывается dealloc. Поскольку у меня уже есть релиз и нуль в viewDidUnload, у меня его нет в dealloc. Отлично.

Но если нет низкой ошибки памяти, viewDidUnload никогда не вызывается. dealloc называется, и поскольку у меня нет релиза и нулевого материала, происходит утечка памяти.

Другими словами, будет ли dealloc когда-либо вызываться без вызова viewDidUnload?

И практический подход к этому, если я выложу и что-то установил в viewDidLoad, и я его выпустил и установил в nil в viewDidUnload, не могу ли я оставить его из dealloc, или я делаю защитную проверку nil dealloc и release/ноль, если это не ноль?

+3

Вы знаете, что вы можете отправить nil сообщение о выпуске без проблем, не так ли? nil просто игнорирует все отправленные сообщения и возвращает nil как значение без ошибок. Нет необходимости в защитных проверках на нуль, например, с NULL –

ответ

8

Отпустите его в обоих. Вам не нужно проверять нуль. Выпуск на ноль ничего не делает.

Однако в представленииDidUnload не выпускаются ivars, которые нельзя легко воссоздать в viewDidLoad, если вид снова загрузится.

Обычно (без предупреждений о памяти) viewDidUnload не вызывается, вызывается только dealloc.

+0

Для хорошей гигиены, следует ли установить нуль в dealloc? – alyssackwan

+0

Чтобы быть в безопасности, да, но я могу только подумать о нескольких случаях, когда это имеет значение. Мне нравится использовать setter, чтобы установить его в nil, так как он освобождает его и устанавливает его в nil в одной строке (то есть: self.ivar = nil;) – progrmr

+6

Нет причин устанавливать ipars на 'nil' в' dealloc'. Кроме того, против рекомендаций Apple использовать сеттеры в 'dealloc' (т. Е.' Self.ivar = nil'), так как потенциально может возникнуть проблема с использованием сеттеров в частично освобожденном объекте. Вероятно, не проблема в использовании сеттеров, но для того, чтобы быть на 100% безопасным, вы можете вместо этого использовать '[ivar release ]'. – shosti

Смежные вопросы