-dealloc
является верным, и -viewDidUnload
будет работать, но обычно сохраненные представления обнуляются только в -viewDidUnload
и не освобождаются. Это похоже на практику Apple, и именно это они запекли в Xcode, когда вы создаете автоматически сгенерированный IBOutlet через редактор Assistant.
Для автоматически сгенерированных IBOutlets автоматически сгенерированное -viewDidUnload
выглядит следующим образом:
- (void)viewDidUnload {
[self myView1:nil];
[self myView2:nil];
[self myView3:nil];
[super viewDidUnload];
}
Кроме того, из Apple Docs на -viewDidUnload
:
Предпочтительный способ отказаться от владения любым объектом (в том числе в торговых точках) - использовать соответствующий метод доступа, чтобы установить значение объекта равным nil. Однако, если у вас нет метода доступа для данного объекта, вам, возможно, придется освободить объект явно
Итак, поехали. Если у вашей торговой точки есть свойство, связанное с ней (что они все должны больше), то обнулите его в -viewDidUnload
- но не отпускайте его. Это имеет смысл, если учесть, что на самом деле происходит в синтезированном методе доступа; код выглядит примерно так:
- (void) setMyView1 : (UIView *) view {
if (myView1) // the associated IVAR is already set
[myView1 release];
myView1 = [view retain];
}
Как видите, установка свойства синтеза на nil неявно освобождает сохраненный объект.
Также из документов по -dealloc
:
Если вы реализуете этот метод, но создаете свое приложение для iOS 2.x, ваш метод dealloc должен освободить каждый объект, но также должен установить ссылку на этот объект на nil перед вызовом super.
Если вы не поддерживаете iOS2.x, нет необходимости устанавливать объекты равными nil в dealloc.
Итак, подведем итоги документов Apple относительно -viewDidUnload
и -dealloc
:
- В
-viewDidUnload
, нулевые свойства (включая свойства IBOutlet), но не освобождает их
- В
-dealloc
освобождать свойства, но не обнулять их (если не собирается сборка для 2.x).