天天看点

iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、view

ios视图控制对象生命周期:

init、viewdidload、viewwillappear、viewdidappear、viewwilldisappear、viewdiddisappear的区别及用途

init-初始化程序

viewdidload-加载视图

viewwillappear-uiviewcontroller对象的视图即将加入窗口时调用;

viewdidapper-uiviewcontroller对象的视图已经加入到窗口时调用;

viewwilldisappear-uiviewcontroller对象的视图即将消失、被覆盖或是隐藏时调用;

viewdiddisappear-uiviewcontroller对象的视图已经消失、被覆盖或是隐藏时调用;

viewvillunload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;

viewdidunload-当内存过低,释放一些不需要的视图时调用。

        视图控制对象通过alloc和init来创建,但是视图控制对象不会在创建的那一刻就马上创建相应的视图,而是等到需要使用的时候才通过调用loadview来创建,这样的做法能提高内存的使用率。比如,当某个标签有很多uiviewcontroller对象,那么对于任何一个uiviewcontroller对象的视图,只有相应的标签被选中时才会被创建出来。

比如如下代码:

我们将uiviewcontroller的init方法中访问的实例变量view在init中将背景设置为黄.色,运行程序,我们能发现背景的确变成了黄.色,但是,在我们还没有需要使用视图的时候,该视图已经加载好了,在uiviewcontroller的初始方法中访问实例变量view,会导致延迟载入机制失效,这个问题看上去不是很严重,但是如果考虑到内存过低警告,那么问题就大了。。。

运行程序,选择模拟器中的硬件->模拟内存过低警告,我们会发现,原本设置的黄.色背景不见了,这是因为,内存过低,视图控制对象会在发出内存过低警告时收到didreceivememorywarning消息,该方法默认实现,检查视图控制对象的视图是否可见,如果不可见,则释放掉,下次在加载该视图时就不会执行init方法,而是只执行viewdidload方法,所以需要将[[selfview ] setbackgroundcolor:[uicoloryellowcolor]];放到viewdidload中,这样如果视图因为内存过低被释放掉了,下次需要使用到该视图的时候,程序会默认取执行该视图的viewdidload方法,这样背景颜色就又出来了。

init、viewdidload、viewwillappear、viewdidappear、viewwilldisappear、viewdiddisappear的执行顺序:

 从程序的log来看:

2012-10-19 15:51:44.811inhyron[483:b903] init

2012-10-19 15:51:54.081inhyron[483:b903] viewdidload

2012-10-19 15:51:54.082inhyron[483:b903] viewvillappear

2012-10-19 15:51:54.084 inhyron[483:b903] viewdidappear

很明显,先执行init、然后执行viewdidload,然后是viewwillappear最后是viewdidappear,这样视图就创建好了,当视图消失或者被覆盖的时候:

2012-10-19 15:54:14.557inhyron[483:b903] viewwilldisappear

2012-10-19 15:54:14.558inhyron[483:b903] viewdiddisappear

这样一来视图就消失了,当模拟内存警告的时候:

2012-10-19 15:55:14.333inhyron[483:b903] received simulated memory warning.

2012-10-19 15:55:14.334inhyron[483:b903] viewwillunload

2012-10-19 15:55:14.335 inhyron[483:b903]viewdidunload

从log可以看出,当视图控制对象收到内存警告的时候,程序会执行viewwillunload最后是执行viewdidunload。

这样,一套的流程就完成了,不知道写的是否详细。。。。

摘自:http://blog.sina.com.cn/s/blog_5da93c8f0101q3f6.html