2011-08-25 2 views
3

Шаблон компании Apple предоставляет этот комментарий в viewDidUnload:сколько выпустить в viewDidUnload

// Release any retained subviews of the main view. // e.g. self.myOutlet = nil;

Так что я обычно набор IB Outlets к nil в viewDidUnload затем отпустить их в dealloc. Вопрос в том, что все мои другие сохраненные объекты ivar, некоторые из которых являются представлениями, которые были добавлены программно, в то время как другие являются моделями данных, должны ли они также рассматриваться в этих двух методах? Если нет, почему бы и нет?

из этого ответа here я заключаю, что только просматривать связанные объекты должны идти в viewDidUnload, как =nil заявления, которые, вероятно, следует включать в себя не- IB Outlet сохранили взгляды, правильно? Затем все остальные объекты, включая модели данных, должны входить в dealloc как release операторов. Это обычная практика?

ответ

1

viewDidUnload вызван в результате низкого состояния памяти, чтобы выгрузить представление для контроллера вида, который в настоящее время не отображается. В этот момент был выпущен объект представления контроллера вида, что означает, что все объекты, которые являются подзонами viewController.view, были выпущены, но они не освобождаются, если вы сохраняете их в своих ivars.

Вы должны освободить любой объект, который будет воссоздан при повторном загрузке представления или в том, что вы можете легко воссоздать по мере необходимости. В следующий раз, когда используется представление, представление будет воссоздано либо из NIB, либо путем вызова loadView, чтобы все те вещи, которые вы выпустили, будут воссозданы.

Когда ваше представление поступает из NIB, все объекты вида, указанные в NIB, создаются и добавляются в виде подсмотров представления представления контроллера. Любые ivars с IBOutlets также связаны с этими подзонами, так что вы также «владеете» этими объектами (у вас есть на них удержание). Вам нужно освободить этих иваров, чтобы они действительно получили dealloc'd.

Когда ваш вид создается программно в loadView, вы также должны отпустить те объекты, которые сохранены вашими иварами, которые будут воссозданы в loadView при следующем загрузке представления.

То же самое для всего, что вы создаете в viewDidLoad (или viewWillAppear или где-либо еще), например модели данных, если вы можете «легко» его создать позже, когда представление загружается снова или когда объект нужен, то он должен быть выпущен в viewDidLoad для уменьшения использования памяти. Фактически для объектов без просмотра, например, для модели данных, я бы выпустил ее в didReceiveMemoryWarning.

Назначение ноля к нераспределенному имуществу с использованием сеттера вызывает высвобождение для отправки в них, когда вы пишете self.myOutlet = nil вы вызываете метод сеттера, который реализуется что-то вроде этого:

-(void)setMyOutlet:(id)newObject 
{ 
    [newObject retain];  // does nothing if newObject is nil 
    [myOutlet release];  
    myOutlet = newObject; 
} 
+0

Если вы ahve удерживаемыми модель данных в качестве ivar контроллера представления, и вы хотите, чтобы эти данные сохранялись в памяти в случае выгрузки вида контроллера представления, похоже, что viewDidLoad не является хорошим местом для создания этой модели. вы бы рекомендовали метод делегата для создания ivars контроллера представления в такой ситуации? или, возможно, более традиционно, просто сохраняйте данные на устройстве через Core Data. моя проблема в том, что модель данных приобретает ее содержимое из Интернета; для его освобождения требуется еще одна загрузка, чтобы продолжить ее использование позже. – johnbakers

+0

Если вы загружаете данные из Интернета, я обычно не называю это «легким» для воссоздания. Я бы не выпустил его, иначе я бы сохранил его в основных данных или plist или NSUserDefault или SQL DB, в зависимости от его размера и структуры. – progrmr

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