kingcos / Perspective

📝 Write something with perspectives.
https://kingcos.me
185 stars 15 forks source link

探究 UIViewController 生命周期 #22

Open kingcos opened 6 years ago

kingcos commented 6 years ago
Date Notes Swift Xcode
2017-03-10 首次提交 3.0 8.2.1

前言

对象的生命周期一直是开发者所需要关心的,教授 CS193p 的老师 Paul 也详细的讲述了 UIViewController 的生命周期。为了记述这一过程,故作此文。由于 Xcode 提供了纯代码和 Storyboard(Xib 同理)两种布局 UI 的方式,因此初始化部分略有不同。

为了方便观察,我创建了一个 BaseViewController,继承自原本的 UIViewController,重写其中的生命周期方法,并让后续新的控制器继承自该控制器,以便观察。

本文对应的 Demo 可以在 https://github.com/kingcos/UIViewController-UIView-LifecycleDemo 查看、下载。

Structure

Initialization

Storyboard

OUTPUT: init(coder:) awakeFromNib()

init(coder:)

awakeFromNib()

Code

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()

viewWillAppear(_:)

注意: 如果控制器 A 被展示在另一个控制器 B 的 popover 中,那么控制器 B 不会调用该方法,直到控制器 A 清除。

viewWillLayoutSubviews()

viewDidLayoutSubviews()

viewDidAppear(_:)

viewWillDisappear(_:)

viewDidDisappear(_:)

didReceiveMemoryWarning()

deinit

Note

Rotation

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))

Present & Dismiss

OUTPUT: viewWillDisappear viewDidDisappear 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()

Reference