2010-07-26 3 views
9

Я положил NSLog(@"%@::%@", [[self class] description], NSStringFromSelector(_cmd)); как в viewDidLoad, так и в viewDidUnload контроллера.Почему viewDidUnload называется реже, чем viewDidLoad?

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

Почему?

+0

Мне просто интересно, что если мой ответ будет принят, у меня будет +50 repu, правильно? Почему я не получил этого? – vodkhang

+0

@ Водханг, моя вина. Я не понял, что должен нажать «Принять» и значок «+ 50». – ohho

ответ

17

ViewDidLoad и viewDidUnload не соответствуют друг другу.

ViewDidUnload вызывается только при получении предупреждения о памяти. Затем система автоматически вызовет ваш viewDidUnload.

В обычном случае, когда вы нажимаете MyViewController и выталкиваете его. Будет жизненный цикл происходит так:

init 

viewDidLoad 

release 

Это означает, что всякий раз, когда вы инициализации и тяни/представить точку зрения, один viewDidLoad будет называться. Но когда вы открываете представление, релиз будет вызываться в обычном случае, а viewDidUnload будет вызван в память.

Это совершенно неявно, и Apple не указывает это на Руководство. Вот несколько ссылок: Load and Unload cycle

+0

Тогда в чем разница между viewDidUnload и didRecieveMemoryWarning? –

+0

Во-первых, приложение получает предупреждение о низкой памяти из системы. Затем каждый контроллер просмотра вызывает метод didReceiveMemoryWarning. Затем, если контроллер представления отпускает свое представление, он вызывает свой метод viewDidUnload. Вы можете переопределить этот метод для выполнения любой дополнительной очистки, необходимой для ваших представлений и просмотра иерархии. – vodkhang

+0

Посмотрите на ссылку цикла загрузки и разгрузки – vodkhang

1

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

  1. viewDidLoad: контроллер загружает посмотреть
  2. viewDidUnload: предупреждение памяти, контроллер выгружает Просмотреть
  3. viewDidLoad: контроллер загружает смотреть снова
  4. -: контроллер освобождается, не явно выгрузить вид

Вы и с помощью 2 -viewDidLoad звонков и 1 вызов `-viewDidUnload '.

Может также положить NSLog в метод -dealloc и посмотреть, если количество -dealloc и -viewDidUnload вызовов в сочетании соответствует числу -viewDidLoad вызовов.

0

Когда новый вид загружается, старый вид все еще можно загрузить в фоновом режиме. Вы ищете viewWillAppear как conterpart, я думаю.

просмотров только в случае сохранения памяти.

Смежные вопросы