viewDidUnload вызывается после dealloc? - PullRequest
0 голосов
/ 18 февраля 2011

Когда я отлаживал свое приложение для iPad, я обнаружил, что из-за нехватки памяти были вызваны некоторые контроллеры представления viewDidUnload. Но через несколько секунд их viewDidLoad называются. И снова из-за нехватки памяти viewDidUnload, затем viewDidLoad снова. Это похоже на то, что файловая система продолжает обмениваться файлами из-за нехватки памяти.

Это должно быть так, или я сделал что-то не так?

Тогда я хочу освободить контроллер вида, чтобы избавиться от этого. Но иногда viewDidUnload вызывается до dealloc, а затем происходит сбой из-за селектора, отправленного в освобожденный контроллер представления.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 25 апреля 2012

Это совершенно нормальное поведение. viewDidUnload вызывается в ситуации нехватки памяти, чтобы уведомить контроллер о том, что представление было освобождено.

Четкое описание шагов приведено в Руководстве по программированию контроллера представления для iOS .

Специально посмотрите шаги, описанные в разделе Понимание того, как загружаются и выгружаются представления , где описывается цикл выгрузки:

  1. Приложение получает предупреждение о нехватке памяти от системы.

  2. Каждый контроллер представления вызывает свой метод didReceiveMemoryWarning. Если вы переопределите этот метод, вы должны использовать его для освобождения памяти или объекты, которые больше не нужны объекту контроллера вашего представления. Не использовать это, чтобы освободить вид вашего контроллера представления. Вы должны позвонить супер в некоторых указать в вашей реализации, чтобы убедиться, что реализация по умолчанию пробеги. Реализация по умолчанию пытается освободить представление.

  3. Если представление нельзя безопасно разблокировать (например, оно видно на экране), возвращается реализация по умолчанию.

  4. Контроллер представления вызывает свой метод viewWillUnload, чтобы сообщить подклассам о том, что представления будут удалены. Подкласс обычно переопределяет метод viewWillUnload, когда необходимо сохранить любые свойства вида до его уничтожения.

и т. Д.

В вашем конкретном случае вы определенно не хотите освободить контроллер представления в этом случае. Если вам необходимо выполнить какое-либо дальнейшее управление памятью, в то время как там недостаточно памяти, вам следует переопределить реализацию по умолчанию didReceiveMemoryWarning . Как указано в документации, не забудьте позвонить [super didReceiveMemoryWarning];.

...