viewDidUnload вызывается в результате нехватки памяти, чтобы выгрузить представление для контроллера представления, который в данный момент не виден. На этом этапе объект представления контроллера представления был освобожден, что означает, что все объекты, которые являются подпредставлениями viewController.view, были освобождены, но они не освобождаются, если вы сохраняете их в своих ivars.
Вы должны освободить любой объект, который будет воссоздан при повторной загрузке представления или вещей, которые вы можете легко воссоздать по мере необходимости. При следующем использовании представления оно будет воссоздано либо из NIB, либо путем вызова loadView, чтобы все те вещи, которые вы отпускаете, были воссозданы.
Когда ваше представление исходит из NIB, все объекты представления, указанные в NIB, создаются и добавляются как подпредставления представления контроллера представления. Любые ivars с IBOutlets также связаны с этими подпредставлениями, так что вы также «владеете» этими объектами (у вас есть удержание на них). Вам нужно выпустить эти ивары, чтобы они действительно получили dealloc'd.
Когда ваше представление создается программно в loadView, вы также должны освободить те объекты, которые сохраняются вашими иварами, которые будут воссозданы в loadView при следующей загрузке представления.
То же самое для всего, что вы создаете в viewDidLoad (или viewWillAppear или где-либо еще), например, для моделей данных, если вы можете «легко» воссоздать его позже, когда представление загружается снова или когда нужен объект, его следует освободить в viewDidLoad для уменьшить использование памяти. На самом деле для элементов без просмотра, таких как модель данных, я бы выпустил их в didReceiveMemoryWarning.
Присваивание nil сохраненному свойству с помощью установщика приводит к тому, что им отправляется релиз, когда вы пишете self.myOutlet = nil
, вы вызываете метод установщика, который реализован примерно так:
-(void)setMyOutlet:(id)newObject
{
[newObject retain]; // does nothing if newObject is nil
[myOutlet release];
myOutlet = newObject;
}