В iPad DetailView ситуация, viewDidUnload не вызывается - PullRequest
0 голосов
/ 09 августа 2011

Я настроил подробное представление, у меня есть несколько загружаемых файлов Nib в зависимости от того, какой элемент выбран в таблице контроллера корневого представления.

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

Кто-нибудь знает, почему это будет?

Спасибо.

1 Ответ

1 голос
/ 09 августа 2011

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

Я думаю, что пример поможет определить, когда viewDidUnloadназывается.Допустим, у вас есть UINavigationController, и вы открыли новый вид.Это новое представление очень сильно влияет на использование памяти, поэтому приложение пытается сохранить некоторые ресурсы.Это достигается путем просмотра загруженных видов, которых нет на экране.Если это так, он вызывает viewDidUnload, где в идеале вы удаляете вещи, которые вы встроили в loadView или viewDidLoad.Затем, когда вы возвращаетесь к этому представлению, он вызывает loadView или viewDidLoad снова, чтобы пересобрать то, что было сброшено в viewDidUnload.

Но если ему не нужно освобождать память, чтобы показать вашподробный вид, он не будет вызывать его при обычной обработке.Вот почему viewWillDisappear называется (и dealloc), но никогда viewDidUnload.

Из документации Apple:

Когда появляется предупреждение о нехватке памяти, класс UIViewController очищает свои представления, если он знает, что может перезагрузить или воссоздать их позже.Если это происходит, он также вызывает метод viewDidUnload, чтобы дать вашему коду возможность отказаться от владения любыми объектами, связанными с вашей иерархией представления, включая объекты, загруженные с помощью файла nib, объекты, созданные в вашем методе viewDidLoad, и объекты, созданные лениво ввремя выполнения и добавлено в иерархию представлений.Как правило, если ваш контроллер представления содержит выходы (свойства или необработанные переменные, содержащие ключевое слово IBOutlet), вы должны использовать метод viewDidUnload, чтобы отказаться от владения этими выходами или любыми другими данными, относящимися к представлению, которые вам больше не нужны.

Справочник по классам UIViewController

...