Будет ли выгружен UIViewController, находящийся в настоящее время в стеке viewController UINavigationContoller? - PullRequest
0 голосов
/ 01 июня 2011

Также кто-нибудь скажет мне, в чем разница между viewDidUnload и dealloc?

Ответы [ 5 ]

1 голос
/ 01 июня 2011

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

dealloc: Освобождает память, занятую получателем. Метод dealloc объекта вызывается косвенно с помощью метода протокола NSObject выпуска. Подробнее

0 голосов
/ 01 июня 2011

Также важно, что viewDidLoad будет вызван снова после viewDidUnload.Если вы выполняете настройку в viewDidLoad, вы должны обращаться с ней таким образом, чтобы повторный вызов не вызывал утечек памяти.

Либо все разрушайте в viewDidUnload (вежливо, если онипамяти) или проверьте их наличие при настройке и не делайте этого дважды.(И, конечно же, полностью разорвите их до или во время dealloc метода.)

Вы не гарантированно, что viewDidUnload будет вызвано до dealloc.

0 голосов
/ 01 июня 2011

UIViewController с никогда не выгружаются. Им могут принадлежать UIView.

Итак, если вы спрашиваете, можно ли выгрузить UIView, хотя его контроллер был перенесен на контроллер навигации, ответ - да. Только отображаемый в данный момент UIView не будет выгружен (если вы не препятствует работе механизма выгрузки).

Кроме того, viewDidUnload - это сообщение, которое отправляется UIViewController, когда представление, которым он управляет, выгружено, что обычно не то же самое, что освобождение представления. Фактически, когда представление фактически освобождено, оно точно выгружается, но viewDidUnload не отправляется.

0 голосов
/ 01 июня 2011

UIViewController, который был помещен в стек контроллера навигации и еще не был извлечен, не будет освобожден. Тем не менее, его свойство view может быть выгружено, в частности, если возникает условие нехватки памяти И представление для этого контроллера представления в настоящее время не видно (что-то покрывает его, например модальное диалоговое окно, или другой виртуальный канал, помещенный сверху из этого), представление может быть выгружено системой.

viewDidUnload - это плохое имя для того, что делает метод. Он вызывается, когда из-за нехватки памяти представление выгружается, т. Е. Это не «противоположный» метод viewDidLoad, который, я думаю, вы могли бы ожидать.

Подробнее:

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

0 голосов
/ 01 июня 2011

Да, он может быть выгружен при появлении предупреждения о памяти.

Что касается разницы между viewDidUnload и dealloc - первый вызывается, когда ваше представление выгружается, как правило, из-за нехватки памяти.Последний вызывается, когда счет сохранения вашего объекта достигает нуля (т.е. он полностью освобождается из памяти)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...