Когда я должен освободить объекты в- (void)viewDidUnload, а не в-dealloc?
что такое -(void)viewDidUnload
хорошо?
не мог бы я просто переложить все в -dealloc
? Если бы вид выгружался, не было бы -dealloc
равно?
8 ответов:
в дополнение к тому, что уже было указано, я хотел бы подробнее рассказать о логике
-viewDidUnload
.одна из самых важных причин для его реализации заключается в том, что
UIViewController
подклассы обычно также содержат собственные ссылки на различные подвиды в иерархии представлений. Эти свойства могли быть установлены черезIBOutlets
при загрузке из наконечника, или программно внутри-loadView
, например.дополнительное владение подвидами
UIViewController
означает, что даже когда его представление удаляется из иерархии представлений и освобождается для сохранения памяти, через которую подвиды также освобождаются представлением, они фактически не будут освобождены, потому чтоUIViewController
сам по себе по-прежнему содержит свои собственные выдающиеся сохраняя ссылки на эти объекты, а также. ОтпускаяUIViewController
дополнительное владение этими объектами гарантирует, что они будут освобождены, а также освободить память.объекты, которые вы выпускаете здесь, как правило, воссоздается и устанавливается снова, когда
UIViewController
видre-loaded
, либо из наконечника, либо через реализацию-loadView
.также обратите внимание, что
UIViewController
view
недвижимость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 переменные больше не будут существовать.