Open kingcos opened 6 years ago
对象的生命周期一直是开发者所需要关心的,教授 CS193p 的老师 Paul 也详细的讲述了 UIViewController 的生命周期。为了记述这一过程,故作此文。由于 Xcode 提供了纯代码和 Storyboard(Xib 同理)两种布局 UI 的方式,因此初始化部分略有不同。
为了方便观察,我创建了一个 BaseViewController,继承自原本的 UIViewController,重写其中的生命周期方法,并让后续新的控制器继承自该控制器,以便观察。
本文对应的 Demo 可以在 https://github.com/kingcos/UIViewController-UIView-LifecycleDemo 查看、下载。
OUTPUT: init(coder:) awakeFromNib()
init(coder:)
awakeFromNib()
OUTPUT: init(nibName:bundle:) - NibName: nil, Bundle: nil
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()
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))
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()
前言
对象的生命周期一直是开发者所需要关心的,教授 CS193p 的老师 Paul 也详细的讲述了 UIViewController 的生命周期。为了记述这一过程,故作此文。由于 Xcode 提供了纯代码和 Storyboard(Xib 同理)两种布局 UI 的方式,因此初始化部分略有不同。
为了方便观察,我创建了一个 BaseViewController,继承自原本的 UIViewController,重写其中的生命周期方法,并让后续新的控制器继承自该控制器,以便观察。
本文对应的 Demo 可以在 https://github.com/kingcos/UIViewController-UIView-LifecycleDemo 查看、下载。
Initialization
Storyboard
init(coder:)
init(coder:)
。awakeFromNib()
awakeFromNib()
中安全地发送。awakeFromNib()
可以进行在设计时无法完成的必要额外设置。Code
init(nibName:bundle:)
init(nibName:bundle:)
。loadView()
loadView()
即加载控制器管理的 view。viewDidLoad()
中。viewDidLoad()
viewDidLoad()
。viewWillAppear(_:)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_:)
viewWillDisappear(_:)
viewWillAppear(_:)
。viewDidDisappear(_:)
viewDidAppear(_:)
。didReceiveMemoryWarning()
deinit
Note
Rotation
willTransition(to:with:)
方法。viewWillLayoutSubviews()
和viewDidLayoutSubviews()
。Present & Dismiss
viewWillDisappear
和viewDidDisappear
方法。viewWillAppear
和viewDidAppear
方法。死循环
loadView()
没有加载 view,viewDidLoad()
会一直调用loadView()
加载 view,因此构成了死循环,程序即卡死。Reference