Опишите жизненный цикл UIViewController в UIKit.

«Опишите жизненный цикл UIViewController в UIKit.» — вопрос из категории UIKit, который задают на 36% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные этапы и методы:

  1. Инициализация и загрузка View:

    • init(coder:) / init(nibName:bundle:) – создание экземпляра контроллера.
    • loadView() – создает или загружает иерархию view. Переопределяйте, если создаете view вручную.
    • viewDidLoad()Вызывается один раз после загрузки view. Идеальное место для начальной настройки UI.
  2. Появление на экране:

    • viewWillAppear(_:) – Вызывается перед тем, как view станет видимой. Хорошее место для обновления данных или анимаций, зависящих от контекста.
    • viewDidAppear(_:) – Вызывается после того, как view появилась на экране. Место для запуска тяжелых операций (например, сетевых запросов) или анимаций.
  3. Исчезновение с экрана:

    • viewWillDisappear(_:) – Вызывается перед скрытием view. Место для сохранения состояния или отмены изменений.
    • viewDidDisappear(_:) – Вызывается после того, как view скрылась.
  4. Изменение layout (разметки):

    • viewWillLayoutSubviews() – Вызывается перед layoutSubviews у корневой view.
    • viewDidLayoutSubviews() – Вызывается после. Идеально для корректировки layout после расчета системой Auto Layout.
  5. Управление памятью и деинициализация:

    • didReceiveMemoryWarning() – Уведомление о нехватке памяти.
    • deinit – Вызывается перед освобождением контроллера из памяти.

Практический пример использования:

class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Разовая настройка: добавить subviews, настроить навигацию.
        setupTableView()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Обновить данные каждый раз при появлении.
        tableView.reloadData()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // Скорректировать frame после Auto Layout.
        customView.layer.cornerRadius = customView.bounds.width / 2
    }
}