← Назад к вопросам

Какие знаешь колбэки у жизненного цикла ViewController?

1.6 Junior🔥 221 комментариев
#UIKit и верстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Жизненный цикл UIViewController: ключевые колбэки

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

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

Ключевые методы можно разделить на несколько групп:

1. Инициализация и загрузка представления

// Вызывается при создании контроллера из storyboard/xib
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)

// Вызывается при создании через storyboard
init?(coder: NSCoder)

// Основной метод загрузки иерархии представлений
override func loadView() {
    super.loadView()
    // Создание view программно (если не используется Interface Builder)
}

// Вызывается после загрузки view в память
override func viewDidLoad() {
    super.viewDidLoad()
    // Настройка элементов интерфейса, загрузка данных
    // Вызывается ОДИН раз за жизненный цикл
}

2. Появление и исчезновение с экрана

// Вызывается перед появлением view на экране
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // Обновление данных, анимации, скрытие/показ элементов
    // Может вызываться многократно
}

// Вызывается после полного появления view на экране
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // Запуск анимаций, таймеров, отслеживание аналитики
}

// Вызывается перед исчезновением view с экрана
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Приостановка анимаций, сохранение состояния
}

// Вызывается после полного исчезновения view с экрана
override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    // Остановка ресурсоемких операций, очистка
}

3. Изменение размеров и адаптация макета

// Вызывается при изменении размеров view
override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    // Внесение изменений ДО вычисления layout
}

// Вызывается после изменения layout subviews
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // Настройка фреймов, корректировки ПОСЛЕ вычисления layout
}

// Вызывается при изменении trait collection (размер класса, scale factor)
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    // Адаптация интерфейса к новым характеристикам
}

4. Управление памятью и деинициализация

// Вызывается при нехватке памяти
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Освобождение кэшей, временных данных
}

// Современная альтернатива для управления памятью
func viewControllerDidReceiveMemoryWarning(_ viewController: UIViewController)

// Вызывается перед уничтожением контроллера
deinit {
    // Отписка от уведомлений, остановка таймеров
    // Освобождение ресурсов
}

Дополнительные важные колбэки

  • viewWillTransition(to:with:) — реагирование на смену ориентации устройства
  • updateViewConstraints() — обновление кастомных констрейнтов
  • restorationIdentifier и encodeRestorableState(with:) — поддержка state restoration

Практические рекомендации по использованию

  • viewDidLoad — идеальное место для первоначальной настройки, которая выполняется один раз
  • viewWillAppear — используйте для обновления данных, которые могли измениться
  • viewDidAppear — подходит для запуска анимаций и отслеживания аналитики
  • viewWillDisappear — сохраняйте состояние пользовательского ввода
  • deinit — обязательно отписывайтесь от NotificationCenter и KVO

Пример типичного сценария

class ProfileViewController: UIViewController {
    private var dataService: DataService!
    private var updateTimer: Timer?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        configureConstraints()
        dataService = DataService()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        loadUserData()
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        startAutoUpdate()
        Analytics.trackScreenView("Profile")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        updateTimer?.invalidate()
        saveUserPreferences()
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

Понимание жизненного цикла UIViewController критически важно для создания стабильных, отзывчивых приложений с правильным управлением памятью и ресурсами. Каждый колбэк имеет свою специфику и оптимальные use cases, которые следует учитывать при разработке.