因为种种缘由,掘金等第三方平台博客再也不保证可以同步更新,欢迎移步 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,所以构成了死循环,程序即卡死。