Встречается на 36% собеседований по Mobile
Жизненный цикл UIViewController
Жизненный цикл UIViewController — это последовательность вызовов методов, которые система выполняет от создания контроллера до его уничтожения. Понимание этой последовательности необходимо для корректной настройки интерфейса, управления данными и обработки изменений состояния. В большинстве случаев контроллер создается из storyboard, и система автоматически вызывает методы жизненного цикла в определенном порядке.
Основные этапы жизненного цикла
-
Создание и подготовка
- Контроллер создается либо программно, либо из storyboard. При использовании storyboard система выполняет инициализацию «за сценой».
- Перед переходом к контроллеру вызывается метод
prepareForSegue(_:sender:), если переход осуществляется через segue. В этот момент outlet-свойства еще не установлены, поэтому обращаться к ним нельзя.
-
Установка outlet-свойств
- После создания контроллера система устанавливает все
@IBOutlet-свойства. Это происходит до вызоваviewDidLoad, поэтому вviewDidLoadуже можно безопасно обращаться к outlet.
- После создания контроллера система устанавливает все
-
Загрузка представления
- Метод
viewDidLoad()вызывается один раз после того, как представление контроллера загружено в память. Это идеальное место для первоначальной настройки данных и интерфейса. Обязательно вызывайтеsuper.viewDidLoad().
- Метод
-
Появление и исчезновение представления
- Перед появлением на экране вызывается
viewWillAppear(_:), сразу после появления —viewDidAppear(_:). - При уходе с экрана вызываются
viewWillDisappear(_:)иviewDidDisappear(_:). Эти методы могут вызываться многократно, например, при переходах между экранами.
- Перед появлением на экране вызывается
-
Изменение геометрии
- При изменении границ представления (поворот, изменение размера) вызываются
viewWillLayoutSubviews()иviewDidLayoutSubviews(). Между этими методами происходит расстановка элементов с помощью Auto Layout. - Для обработки анимации при повороте используйте
viewWillTransition(to:with:).
- При изменении границ представления (поворот, изменение размера) вызываются
-
Нехватка памяти
- В редких случаях система вызывает
didReceiveMemoryWarning(). Здесь можно освободить неиспользуемые ресурсы.
- В редких случаях система вызывает
Пример кода
swift
override func viewDidLoad() {
super.viewDidLoad()
// Настройка интерфейса и данных
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Действия перед появлением
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Действия после появления
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Действия перед исчезновением
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Действия после исчезновения
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// Действия перед расстановкой
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Действия после расстановки
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Освобождение ресурсов
}Подводные камни
- Не обращайтесь к outlet в
prepareForSegue— они еще не установлены. - Всегда вызывайте
superв переопределенных методах жизненного цикла, иначе нарушится работа системы. - Не выполняйте тяжелые операции в
viewDidLoad— он вызывается до появления на экране, и задержка может привести к лагам. - Помните, что
viewWillAppearиviewDidAppearмогут вызываться несколько раз — не используйте их для одноразовой инициализации. - При изменении геометрии не полагайтесь на конкретное количество вызовов — методы могут вызываться часто, поэтому избегайте избыточных вычислений.
Когда использовать
viewDidLoad— для первоначальной настройки, загрузки данных, установки делегатов.viewWillAppear— для обновления данных перед показом, например, при возврате с другого экрана.viewDidAppear— для запуска анимаций, аналитики, наблюдения за клавиатурой.viewWillDisappear— для сохранения изменений, отмены подписок.viewDidDisappear— для остановки анимаций, освобождения ресурсов.didReceiveMemoryWarning— для очистки кэшей и временных данных.
Коротко
- Порядок: создание →
prepareForSegue→ установка outlet →viewDidLoad→viewWillAppear→viewDidAppear→ ... →viewWillDisappear→viewDidDisappear. viewDidLoadвызывается один раз, остальные методы появления/исчезновения — многократно.- Всегда вызывайте
superв переопределенных методах. viewWillLayoutSubviewsиviewDidLayoutSubviewsсвязаны с Auto Layout и вызываются при изменении геометрии.didReceiveMemoryWarning— редкий, но важный метод для освобождения памяти.
Похожие вопросы
- Для чего нужны фрагменты, если есть Activity40%
- Зачем нужен тип ссылок unnowned36%
- Что лучше NSOperationQueue или GCD36%
- В чем разница между синхронными и асинхронными запросами36%
- Чем отличается frame от bounce36%
- Расскажи про RC36%
- Как решить проблему race condition36%
- С какими архитектурами сталкивался36%
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы
