Для чего это -(void)viewDidUnload
нужно?
Могу ли я просто не раскрыть все -dealloc
? Если бы представление действительно выгружалось, все равно не -dealloc
вызывали бы?
Для чего это -(void)viewDidUnload
нужно?
Могу ли я просто не раскрыть все -dealloc
? Если бы представление действительно выгружалось, все равно не -dealloc
вызывали бы?
В дополнение к тому, что уже было указано, я хотел подробнее остановиться на логике -viewDidUnload
.
Одна из наиболее важных причин для его реализации заключается в том, что UIViewController
подклассы обычно также содержат ссылки-владельцы на различные подпредставления в иерархии представлений. Эти свойства могли быть установлены, например, IBOutlets
при загрузке из пера или программно внутри -loadView
.
Дополнительное владение субпредставлениями за счет того, UIViewController
что даже когда его представление удаляется из иерархии представлений и освобождается для экономии памяти, благодаря чему субпредставления также освобождаются представлением, они фактически не будут освобождены, потому что UIViewController
само по себе все еще содержит свои собственные невыполненные сохранение также ссылок на эти объекты. Освобождение UIViewController
дополнительных прав собственности на эти объекты гарантирует, что они будут освобождены, а также освободить память.
Объекты, которые вы выпускаете здесь, обычно воссоздаются и снова устанавливаются при UIViewController
просмотре re-loaded
либо из пера, либо посредством реализации -loadView
.
Также обратите внимание, что UIViewController
view
свойство находится nil
на момент вызова этого метода.
Как говорится в документации :
В такую же ситуацию не
dealloc
вызывается . Этот метод доступен только в OS3 и выше. Разобраться с такой же ситуацией в iPhone OS 2.x было настоящей головной болью!Обновление от июля 2015 г. Следует отметить, что
viewDidUnload
в iOS 6 эта функция устарела, поскольку «представления больше не очищаются в условиях нехватки памяти, поэтому этот метод никогда не вызывается». Итак, современный совет - не беспокоиться об этом и использоватьdealloc
.источник
Это связано с тем, что вы обычно устанавливаете
@property
как"(nonatomic, retain)"
и как таковой сеттер, созданный для вас, освобождает текущий объект, а затем сохраняет аргумент, т.е.... делает что-то вроде:
Следовательно, вы убиваете двух зайцев одним выстрелом: управление памятью (освобождение существующего объекта) и присвоение указателя значения nil (поскольку отправка любого сообщения на указатель nil вернет nil).
Надеюсь, это поможет.
источник
Помните, что
viewDidUnload
это метод в контроллере представления, а не в представлении. Метод представленияdealloc
будет вызван, когда представление выгружается, но метод контроллера представленияdealloc
может быть вызван позже.Если вы получаете предупреждение о нехватке памяти и ваше представление не отображается, что произойдет, например, примерно каждый раз, когда вы используете UIImagePickerController, чтобы позволить пользователю сделать снимок, ваше представление будет выгружено, и после этого его необходимо будет перезагрузить.
источник
Вывод:
Контроллеры представления имеют свойство представления. Обычно перо или фрагмент кода добавляют к этому представлению другие представления. Это часто происходит внутри метода -viewDidLoad, например:
кроме того, файл пера может создавать кнопку и добавлять ее к представлению контроллера представления.
В iPhone OS 2.2 при вызове -didReceiveMemoryWarning из системы вам нужно было что-то освободить, чтобы освободить память. Вы можете освободить представление всего контроллера представления, если это имело смысл. Или просто большое содержимое, занимающее много памяти.
Теперь в новой ОС 3.0 есть метод -viewDidUnload, который будет вызываться из системы, когда представление было выгружено из-за нехватки памяти (пожалуйста, поправьте меня: когда именно это будет вызвано?)
-viewDidUnload используется для освобождения всех объектов, которые принадлежали как самому контроллеру представления, так и представлению. Причина: если контроллер представления содержит ссылки на дочерние элементы представления, то есть кнопку, дочерние представления, на которые ссылаются, не будут освобождены, потому что их счетчик сохранения> = 1. После того, как они были освобождены в -viewDidUnload, они могут быть освобождены. из памяти.
источник
Apple не рекомендует использовать viewWillUnload, теперь вы должны использовать didReceiveMemoryWarning или dealloc для освобождения ваших объектов.
источник
Если контроллер представления извлекается из стека контроллеров навигации и больше нигде не сохраняется, он будет освобожден, и вместо viewDidUnload будет вызываться dealloc. Вы должны освободить представления, созданные в loadView, в dealloc, но нет необходимости устанавливать для переменных значение nil, потому что вскоре после вызова dealloc переменные больше не будут существовать.
источник
Вы можете освободить любые подпредставления, за которые вы держитесь, например, тот UIImageView, который вы сохранили в своем методе loadView, или, еще лучше, изображение, которое было в этом UIImageView.
источник