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。

 

转载于:https://www.cnblogs.com/fussfuss1/p/5599325.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值