Когда я должен освободить объекты в- (void)viewDidUnload, а не в-dealloc?


что такое -(void)viewDidUnload хорошо?

не мог бы я просто переложить все в -dealloc? Если бы вид выгружался, не было бы -dealloc равно?

8 103

8 ответов:

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

одна из самых важных причин для его реализации заключается в том, что UIViewController подклассы обычно также содержат собственные ссылки на различные подвиды в иерархии представлений. Эти свойства могли быть установлены через IBOutlets при загрузке из наконечника, или программно внутри -loadView, например.

дополнительное владение подвидами UIViewController означает, что даже когда его представление удаляется из иерархии представлений и освобождается для сохранения памяти, через которую подвиды также освобождаются представлением, они фактически не будут освобождены, потому что UIViewController сам по себе по-прежнему содержит свои собственные выдающиеся сохраняя ссылки на эти объекты, а также. Отпуская UIViewController дополнительное владение этими объектами гарантирует, что они будут освобождены, а также освободить память.

объекты, которые вы выпускаете здесь, как правило, воссоздается и устанавливается снова, когда UIViewController вид re-loaded, либо из наконечника, либо через реализацию -loadView.

также обратите внимание, что UIViewControllerview недвижимость nil к моменту вызова этого метода.

как информация:

он вызывается в условиях нехватки памяти, когда контроллеру вида необходимо освободить свое представление и любые объекты, связанные с этим представлением, чтобы освободить память.

в той же ситуации dealloc и не называется. Этот метод доступен только в OS3 и выше. То же самое происходит и в iPhone OS 2.х была настоящая боль!

Обновление Июль 2015: это следует отметить, что viewDidUnload был устаревшим в iOS 6, потому что " представления больше не очищаются в условиях нехватки памяти, и поэтому этот метод никогда не вызывается."Итак, современный совет - не беспокоиться об этом и использовать dealloc.

это потому, что вы обычно устанавливаете @property как "(nonatomic, retain)" и как таковой сеттер, созданный для вас, освобождает текущий объект, а затем сохраняет аргумент, т. е.

self.property = nil;

...делает что-то вроде:

[property release];
property = [nil retain];

поэтому вы убиваете двух зайцев одним выстрелом: управление памятью (освобождение существующего объекта) и назначение указателя на nil (так как отправка любого сообщения на указатель nil вернет nil).

Надежда эта помощь.

помните, что viewDidUnload - Это метод в контроллере вида, а не в представлении. Элемент вид!--5-->dealloc метод будет вызван при выгрузке представления, но вид контроллера!--5-->dealloc метод может быть вызван только позже.

Если вы получаете предупреждение о нехватке памяти, и ваш вид не отображается, что произойдет, например, в любое время, когда вы используете UIImagePickerController, чтобы позволить пользователю сделать снимок, ваш вид будет выгружен и вам нужно будет получить после этого перезагрузился.

вывод:

контроллеры представления имеют свойство представления. Обычно перо или фрагмент кода добавляет другие представления к этому представлению. Это часто происходит внутри метода-viewDidLoad, например:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createManyViewsAndAddThemToSelfDotView];
}

кроме того, файл наконечника может создать кнопку и добавить ее в представление контроллера вида.

на iPhone OS 2.2, когда -didReceiveMemoryWarning был вызван из системы, вы должны были выпустить что-то, чтобы освободить память. Вы могли бы освободить вид всего контроллера вида, если это имело смысл. Или просто большая память содержимое в нем.

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}

теперь, в новой ОС 3.0, есть метод-viewDidUnload, который будет вызван из системы, когда представление было выгружено из-за нехватки памяти (пожалуйста, поправьте меня: когда именно это вызывается?)

- viewDidUnload используется для освобождения всех объектов, которые принадлежали как самому контроллеру вида, так и виду. Причина: если контроллер вида держит ссылки на дочерние элементы представления, т. е. кнопки, на которые ссылаются дочерние представления, не будут освобождены, потому что их количество сохранений равно >= 1. После того, как они будут выпущены в-viewDidUnload, они могут освободиться из памяти.

Apple устарела viewWillUnload, теперь вы должны использовать didReceiveMemoryWarning или dealloc, чтобы освободить свои objetcs.

в iOS 6, viewWillUnload и viewDidUnload методы UIViewController теперь устарели. Если вы использовали эти методы для данных, используйте метод didReceiveMemoryWarning. Вы также можно использовать этот метод для освобождения ссылок на представление вид контроллера, если он не используется. Вам нужно будет проверить это вид не в окне, прежде чем делать это.

если контроллер вида извлекается из стека навигационного контроллера и больше нигде не сохраняется, он будет освобожден, и вместо viewDidUnload будет вызван dealloc. Вы должны освободить представления, созданные в loadView в dealloc, но не обязательно устанавливать переменные в nil, потому что вскоре после вызова dealloc переменные больше не будут существовать.

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