Для обычного первого показа: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear. Исчезновение и освобождение — отдельные события.
Определите порядок вызова методов жизненного цикла UIViewController
Для обычного первого показа: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear. Исчезновение и освобождение — отдельные события.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В примере ниже показан кастомный контроллер, наследующий UIViewController, в котором переопределены основные методы жизненного цикла, а также инициализаторы и деструктор. Нужно понять, в какой последовательности будут выводиться сообщения в консоль при создании экземпляра контроллера, его отображении на экране и последующем удалении.
import UIKit
import PlaygroundSupport
class SampleVC: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("viewWillAppear")
}
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad")
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
print("init(nibName:bundle:)")
}
override func loadView() {
super.loadView()
print("loadView")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear")
}
required init?(coder: NSCoder) {
super.init(coder: coder)
print("init(coder:)")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("viewDidDisappear")
}
deinit {
print("deinit")
}
}
Ответ
Для обычного первого показа: init → loadView → viewDidLoad → viewWillAppear → viewDidAppear. Исчезновение и освобождение — отдельные события.
При создании программно используется путь init(nibName:bundle:), из storyboard/archive — init(coder:); оба не обязаны вызываться подряд. View загружается лениво при необходимости. При уходе обычно следуют viewWillDisappear и viewDidDisappear, но deinit вызывается лишь после исчезновения всех сильных ссылок. Повторный показ уже загруженного контроллера повторяет appearance-методы, а не обязательно loadView/viewDidLoad. В условии нет кода показа и удаления, поэтому полный конкретный лог, включая deinit, не определён.