Почему viewDidUnload называется реже, чем viewDidLoad?
Я помещаю NSLog(@"%@::%@", [[self class] description], NSStringFromSelector(_cmd));
в viewDidLoad
и viewDidUnload
контроллера вида.
В журнале я обнаружил, что viewDidLoad
называется намного больше, чем viewDidUnload
, когда приложение перемещается в и из разных .nibs.
Почему?
Ответы
Ответ 1
ViewDidLoad и viewDidUnload не соответствуют друг другу.
ViewDidUnload вызывается только при получении предупреждения о памяти. Затем система автоматически вызовет ваш viewDidUnload.
В обычном случае, когда вы нажимаете MyViewController и выталкиваете его. Жизненный цикл будет происходить следующим образом:
init
viewDidLoad
release
Это означает, что всякий раз, когда вы начинаете и нажимаете/представляете представление, вызывается viewDidLoad. Но когда вы открываете представление, релиз будет вызываться в обычном случае, а viewDidUnload будет вызван в случае предупреждения о памяти.
Это довольно неявно, и Apple не указывает это в Руководстве. Вот несколько ссылок: цикл загрузки и выгрузки
Ответ 2
Я предполагаю, что в тех случаях, когда -viewDidUnload
не вызывался, диспетчер представлений был освобожден.
- viewDidLoad: просмотр загрузки контроллера
- viewDidUnload: предупреждение о сохранении памяти, диспетчер выгружает представление
- viewDidLoad: контроллер снова загружает представление
- -: контроллер освобождается, явно не выгружает представление
Вы и до 2 вызовов -viewDidLoad
и 1 вызов `-viewDidUnload '.
Возможно, также поместите метод NSLog
в метод -dealloc
и посмотрите, совпадает ли число вызовов -dealloc
и -viewDidUnload
с числом вызовов -viewDidLoad
.
Ответ 3
когда новый просмотр загружается, старое представление все еще может быть загружено в фоновом режиме.
вы ищете viewWillAppear как conterpart, я думаю.
отображает только разгрузку в случае сохранения памяти.