Какой метод жизненного цикла UIViewController вызовется, если задать backgroundColor до создания view?

«Какой метод жизненного цикла UIViewController вызовется, если задать backgroundColor до создания view?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При первом обращении к свойству view контроллера, если оно nil, система автоматически вызовет метод loadView() для создания иерархии представлений.

Последовательность вызовов:

  1. Обращение к view.backgroundColor (например, в init или до viewDidLoad).
  2. Геттер view обнаруживает, что представление не загружено.
  3. Вызывается loadView(), который создает экземпляр UIView и присваивает его свойству view.
  4. Сразу после loadView() вызывается viewDidLoad().
  5. Только теперь выполняется присваивание backgroundColor = .blue.

Практический пример:

class MyViewController: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
        // При первом обращении вызовется loadView(), затем viewDidLoad()
        view.backgroundColor = .systemBlue
    }

    override func loadView() {
        print("loadView() вызван — создается view")
        view = UIView() // Явное создание view
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad() вызван — view создана и готова")
        // Здесь backgroundColor уже будет .systemBlue
    }
}

Важно: Прямое обращение к view до ее загрузки считается антипаттерном, так как смешивает логику инициализации и жизненного цикла.