Встречается на 36% собеседований по Mobile

Жизненный цикл UIViewController

Жизненный цикл UIViewController — это последовательность вызовов методов, которые система выполняет от создания контроллера до его уничтожения. Понимание этой последовательности необходимо для корректной настройки интерфейса, управления данными и обработки изменений состояния. В большинстве случаев контроллер создается из storyboard, и система автоматически вызывает методы жизненного цикла в определенном порядке.

Основные этапы жизненного цикла

  1. Создание и подготовка

    • Контроллер создается либо программно, либо из storyboard. При использовании storyboard система выполняет инициализацию «за сценой».
    • Перед переходом к контроллеру вызывается метод prepareForSegue(_:sender:), если переход осуществляется через segue. В этот момент outlet-свойства еще не установлены, поэтому обращаться к ним нельзя.
  2. Установка outlet-свойств

    • После создания контроллера система устанавливает все @IBOutlet-свойства. Это происходит до вызова viewDidLoad, поэтому в viewDidLoad уже можно безопасно обращаться к outlet.
  3. Загрузка представления

    • Метод viewDidLoad() вызывается один раз после того, как представление контроллера загружено в память. Это идеальное место для первоначальной настройки данных и интерфейса. Обязательно вызывайте super.viewDidLoad().
  4. Появление и исчезновение представления

    • Перед появлением на экране вызывается viewWillAppear(_:), сразу после появления — viewDidAppear(_:).
    • При уходе с экрана вызываются viewWillDisappear(_:) и viewDidDisappear(_:). Эти методы могут вызываться многократно, например, при переходах между экранами.
  1. Изменение геометрии

    • При изменении границ представления (поворот, изменение размера) вызываются viewWillLayoutSubviews() и viewDidLayoutSubviews(). Между этими методами происходит расстановка элементов с помощью Auto Layout.
    • Для обработки анимации при повороте используйте viewWillTransition(to:with:).
  2. Нехватка памяти

    • В редких случаях система вызывает 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 → viewDidLoadviewWillAppearviewDidAppear → ... → viewWillDisappearviewDidDisappear.
  • viewDidLoad вызывается один раз, остальные методы появления/исчезновения — многократно.
  • Всегда вызывайте super в переопределенных методах.
  • viewWillLayoutSubviews и viewDidLayoutSubviews связаны с Auto Layout и вызываются при изменении геометрии.
  • didReceiveMemoryWarning — редкий, но важный метод для освобождения памяти.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы