iOS Dev闻道丶iOS(大杂烩)iOS && Android

探究 UIViewController 生命周期

2017-03-07  本文已影响1345人  萌面大道

Lifecycle of UIViewController in iOS

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

也欢迎您关注我的微博 @萌面大道V & 简书

上一篇 下一篇

猜你喜欢

热点阅读