因爲種種緣由,掘金等第三方平臺博客再也不保證可以同步更新,歡迎移步 GitHub:github.com/kingcos/Per…。謝謝!git
Lifecycle of UIViewController in iOSgithub
Date | Notes | Swift | Xcode |
---|---|---|---|
2017-03-10 | 首次提交 | 3.0 | 8.2.1 |
對象的生命週期一直是開發者所須要關心的,教授 CS193p 的老師 Paul 也詳細的講述了 UIViewController 的生命週期。爲了記述這一過程,故做此文。因爲 Xcode 提供了純代碼和 Storyboard(Xib 同理)兩種佈局 UI 的方式,所以初始化部分略有不一樣。安全
爲了方便觀察,我建立了一個 BaseViewController,繼承自本來的 UIViewController,重寫其中的生命週期方法,並讓後續新的控制器繼承自該控制器,以便觀察。app
本文對應的 Demo 能夠在 github.com/kingcos/UIV… 查看、下載。iview
OUTPUT: init(coder:) awakeFromNib()ide
init(coder:)
。awakeFromNib()
中安全地發送。awakeFromNib()
能夠進行在設計時沒法完成的必要額外設置。OUTPUT: init(nibName:bundle:) - NibName: nil, Bundle: niloop
init(nibName:bundle:)
。OUTPUT: loadView() viewDidLoad() viewWillAppear viewWillLayoutSubviews() - Optional((162.0, 308.0, 50.0, 50.0)) viewDidLayoutSubviews() - Optional((67.0, 269.0, 241.0, 129.0)) viewDidAppear viewWillDisappear viewDidDisappear deinit佈局
loadView()
即加載控制器管理的 view。viewDidLoad()
中。viewDidLoad()
。注意: 若是控制器 A 被展現在另外一個控制器 B 的 popover 中,那麼控制器 B 不會調用該方法,直到控制器 A 清除。動畫
viewWillAppear(_:)
。viewDidAppear(_:)
。OUTPUT: willTransition(to:with:) viewWillLayoutSubviews() - Optional((67.5, 269.5, 240.0, 128.0)) viewDidLayoutSubviews() - Optional((213.5, 123.5, 240.0, 128.0)) viewWillLayoutSubviews() - Optional((213.5, 123.5, 240.0, 128.0)) viewDidLayoutSubviews() - Optional((213.5, 123.5, 240.0, 128.0)) viewWillLayoutSubviews() - Optional((213.5, 123.5, 240.0, 128.0)) viewDidLayoutSubviews() - Optional((213.5, 123.5, 240.0, 128.0))ui
willTransition(to:with:)
方法。viewWillLayoutSubviews()
和 viewDidLayoutSubviews()
。OUTPUT: viewWillDisappear viewDidDisappear viewDidDisappear viewWillAppear viewDidAppear
viewWillDisappear
和 viewDidDisappear
方法。viewWillAppear
和 viewDidAppear
方法。class LoopViewController: UIViewController {
override func loadView() {
print(#function)
}
override func viewDidLoad() {
print(#function)
let _ = view
}
}
複製代碼
OUTPUT: loadView() viewDidLoad() loadView() viewDidLoad() loadView() viewDidLoad() loadView() viewDidLoad() loadView()
loadView()
沒有加載 view,viewDidLoad()
會一直調用 loadView()
加載 view,所以構成了死循環,程序即卡死。