Почему 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, я думаю.

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