UIViewController的生命周期及方法调用顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIViewController的生命周期及方法调用顺序相关的知识,希望对你有一定的参考价值。

  • ViewController解析

UIViewController是ios顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放。

UIView与UIWindow共同展示了应用程序的用户界面。可以将UIView理解成画布,UIWindow理解成画框。这两个类的继承关系是这样的:

NSObject — UIResponder — UIView — UIWindow  (UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow)

iOS中,所有显示在界面上的对象都是从UIResponder直接或间接继承的,UIView和UIWindow也不例外。

可以将它们之间的关系想象成这样一个场景:首先会有一个空的画框(UIWindow),我们在画框上放置一块画布(UIView),然后可以在这个画布(UIView)上进行绘画,画布上可能会被画上各种元素,例如UILabel、UIButton等。这些元素其实也是一个又一个UIView,它们会有一个层级关系管理,有点相当于Photoshop图层的概念,层级高的元素会覆盖住层级低的元素,从而导致层级低的元素被部分或完全遮挡。

  • ViewController分类

iOS的ViewController可分为两类:

  1. 主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewControllerUIViewController
  2. 用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationControllerUITabbarController。它们都有一个属性:viewControllers。其中UINavigationController是一种Stack式结构,push进一个ViewController或pop出一个ViewController,因此后一个ViewController一般会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。


第一种ViewController会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
在Xcode中新建一个ViewController时,只可以选择继承自UIViewController和UITableViewController,而它们都是第一种。

  • ViewController代码执行流程

当一个视图控制器被创建时,代码的执行顺序
1、alloc                                 创建对象,分配空间
2、init (initWithNibName)    初始化对象,初始化数据
3、loadView                          从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad                    载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear                视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear                视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序
1、viewWillDisappear            视图将被从屏幕上移除之前执行
2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc                              视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

如下图:

   技术分享

  • 说明:

1. 当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit(懒加载)方式创建.

2. 当你调用的view属性的getter方法:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。

3. loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。

4. 当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。

5. 当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。

6. 当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。

 

以上是关于UIViewController的生命周期及方法调用顺序的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController的生命周期及iOS程序运行顺序

UIViewController的生命周期及iOS程序执行顺序

ObJective-C UIViewController生命周期及iOS程序执行顺序

iOS对UIViewController生命周期和属性方法的解析

iOS程序执行顺序和UIViewController 的生命周期(整理)

🔥UIViewController的生命周期