视图生命周期

UIViewController在加载他的视图的时候,需要经历的几个阶段:

1.首先需要构造器来完成创建,用init方法来完成构建实例,并不会每次创建对象都调用,只有在这个类第一次创建对象时才会调用,无论是ib创建还是代码生成,都需要这一步。

2.加载视图:loadView方法,对所有的视图进行加载。第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view,除非手动调用,否则在ViewController的生命周期中没特殊情况只会被调用一次。

(1)它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view.

(2)如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性

3.接下来进入viewDidLoad方法,对视图内容进行定制,将创建的视图都放在这个方法内,从数据库或者网络加载模型数据装配到子视图中。到这一步,视图加载的过程已经完成,但视图还没有显示到屏幕上。无论视图的展现或消失,这个方法也是只会在将要布局时调用一次。

4.然后进入viewWillAppear,这个方法代表视图已经加载完成,但即将要显示到界面上以前的中间那个极短的一个过程。在这个过程里,可以做一些视图的显示和关闭或者添加监听,但是对比较耗时和繁琐的操作不应该放到这里,因为它的过程比较短暂,不适合过多的操作。

5.执行到viewDidAppear这个方法后,视图已经完全的显示在了界面之上了。一般实现一些简单的动画操作。

6.一旦界面被pop之后,便开始执行viewWillDisappear的方法了,在这个方法里,和willAppear一样,也是极其短暂,不应该加入过多操作,可以放置视图关闭,移除监听,保存状态之类的操作。

7.在界面完全消失以后开始执行viewDidDisappear的方法,

8.在界面消失一段时间后,或者内存吃紧时UIViewController就会收到didReceiveMemoryWarning消息,如果当前UIViewController的view不在应用程序的视图层次结构中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法,或者你调用的是dismiss方式,使界面消失的,那么会进入viewWillUnload方法,在这个方法里,将加载到内存里的视图release掉。

9.最后调用delloc方法,到这一步,系统会抹掉UIViewController创建的这块内存,当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用。

 

使用 NavigationController 去 Push 切换显示的View的时候,调用的顺序:

    从视图1到视图2通过push的方式推进去:

    1.加载视图2的viewcontroller

    2.调用视图1的viewWillDisappear方法

    3.调用视图2的viewWillAppear方法

    4.调用视图1的viewDidDisappear方法

    5.调用视图2的viewDidAppear方法。

    从视图2pop到视图1的方式顺序和push类似

 

使用 UITabbarController 去切换显示的ViewController的时候,调用的顺序:

   在三个 视图1,2,3中进行切换:

   1.在创建UITabbarController之后,对三个视图进行初始化和加载。

   2.从当前现实的视图1切换到视图2时,调用视图1的viewWillDisappear方法,和视图2的viewWillAppear方法

   3.视图2出现之后,调用视图1的viewDidDisappear方法,调用视图2的viewDidAppear方法。

   4.当内存吃紧的时候,UITabbarController中除了当前现实的视图没有被release以外,其他的都会被release掉,在切换时会重新跑一边viewcontroller的生命周期,会感到略微卡顿。

 

posted @ 2015-11-20 23:46  墨VS雪  阅读(444)  评论(0编辑  收藏  举报