Какой метод инициализации UIViewController является самым ранним для настройки аналитики?

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

Ответ

Самый ранний этап для настройки аналитики — это методы инициализации экземпляра класса, а не методы жизненного цикла вью.

Порядок и рекомендуемые методы:

  1. init(nibName:bundle:) — для контроллеров, создаваемых программно.
  2. init?(coder:) — для контроллеров, загружаемых из Storyboard или XIB.
  3. awakeFromNib() — вызывается после загрузки всех объектов из архива (только для контроллеров из Storyboard/XIB).

Пример реализации:

class AnalyticsViewController: UIViewController {

    // Для программной инициализации
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        trackEvent("ViewController initialized programmatically")
    }

    // Для инициализации из Storyboard/XIB
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        trackEvent("ViewController initialized from storyboard")
    }

    // Дополнительный ранний метод для Storyboard/XIB
    override func awakeFromNib() {
        super.awakeFromNib()
        trackEvent("ViewController awoke from NIB")
    }

    private func trackEvent(_ message: String) {
        Analytics.shared.log(event: message)
    }
}

Почему не viewDidLoad()? viewDidLoad() вызывается позже, когда вью уже загружена. Для отслеживания самого факта создания контроллера методы инициализации подходят лучше.