在ios开发给必须要十分清楚ViewController的生命周期,要不在出现一些问题时会不知所措,现在就整理一下这个知识点。

ViewController加载View

从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法。

从内存中alloc出来的情况下,调init方法。

ViewController查找与其关联的view,其顺序是:

  1. 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。

  2. 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。

  3. 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。

    1. 如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;

    1. 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。

  4. 如果子类没有重写的loadView,则ViewController会从StroyBoards中找或者调用其默认的loadView,默认的loadView返回一个空白的UIView对象。

注意第一步

ViewController是判断子类是否重写了loadView,而不是判断调用子类的loadView之后ViewController的View是否为空。就是说,如果子类重写了loadView的话,不管子类在loadView里面能否获取到View,ViewController都会直接调viewDidLoad完成View的加载。


ViewController生命周期函数

启动顺序

  1. initWithCoder

    如果不存在则调用init

  2. loadView //如果说你进行了重写,会在这里调用,这一步可以参考下文


  3. viewDidLoad

    view刚被load完,且已经连接到IBoutlet后,这里放置需要放到初始化里去完成事情。[此时view还没有被显示]

  4. viewWillAppear

    当view即将被显示时调用。

    他适合做两种事情:

    1.最后时刻加载一些高开销的操作

    2.修改几何特性

    说明:

    [如果需要调整view的几何特性[旋转之后 变化之类的巴拉巴拉] 在这里书写]。

    如果是长时间的操作 则最好在此开个现成操作。

  5. viewWillLayoutSubviews

    即将

  6. viewDidLayoutSubviews

    view的子view的frame变化时[如:旋转屏幕]

    经常用此方法[did]来处理旋转后的布局问题。

  7. viewDidAppear

    刚显示

见图:


实践

在我实际的开发中为了使屏幕适应3.5和4寸两个版本,就在程序的启动生命周期中设置view的frame和inset,如果只有frame的问题可以用依赖来实现,可是有inset的问题我就只能这么做了。

其中对viewDidLayoutSubviews的理解还是有些困惑,在启动中他确实是在- (void)viewWillAppear:(BOOL)animated和- (void)viewDidAppear:(BOOL)animated之间执行,但是在viewDidAppear执行完毕后,程序开始后还会调用一次viewDidLayoutSubviews函数。


参考文章:

http://blog.csdn.net/ryantang03/article/details/8264072

http://blog.csdn.net/wihing/article/details/7314702

http://poolo.iteye.com/blog/1696987

http://blog.csdn.net/qijianli/article/details/7826979

http://blog.sina.com.cn/s/blog_615cfa4d0101bgzl.html