UIViewController的生命周期与内存过低警告

来源:互联网 发布:著名的网络暴力事件 编辑:程序博客网 时间:2024/05/01 12:13

1.视图控制对象不会在创建的那一刻马上创建相应的视图(除非在初始化方法中添加了),而是要等到真正需要视图时才会通过loadView来创建(之前在nib文件的关联与加载中说过,loadView负责nib文件的加载工作)。


2.那么视图控制对象在什么时候通过调用loadView来载入视图呢?答案是收到 view 消息时的那一刻。方法用如下方式实现:

- (UIView *)view{         //如果视图是空的则创建视图     if([self isViewLoad] == NO)     {         [self loadView];         [self viewDidLoad];     }       return view;}

3.系统的可用内存过低时,会发出内存警告,视图控制对象会在发出内存警告时收到didReceiveMemoryWarning消息,这个消息的默认实现是:检查UIViewController的view对象是否可见(在使用),如果不可见则释放。(这是低版本的做法,我在ios6.0中做的测试并没有这样做)。如果可见则什么都不做。当再次利用view时再调用view消息,在view消息这里重新创建。


  4.对view的设置,如颜色设置在viewDidLoad方法中设置表较好,因为当真的出现内存警告的时候view被移走了,当再次用到view的时候会向对象发送view消息,而view消息中又会调用viewDidLoad(见上面代码,当然也会调用loadView,但是如果用nib文件来加载view就不能覆写loadView方法了)。这样每次重新创建view都会重新执行view的一些设置。


5.viewDidUnload方法:当view要从内存中被释放时会调用该方法,(释放视图控制对象时不会调用该方法,view还是会被释放)。因为view被释放了,view的子视图的计数器减1,如果这时候子视图是UIViewController的一个成员变量,即在nib文件中该子视图与UIViewController有关联,这时候UIViewCotroller拥有了该子视图,导致该子视图的引用计数不为0,从而不能被释放,到下次view再被利用时,view的子视图会被重新创建,这时候就发生内存泄漏了(即之前与UIViewController有关联的在nib上的子视图没有被指向并没有释放)。所以为了避免内存泄漏,在viewDidUnload方法中向  :在nib文件上并且是view的子视图并且与UIViewController有关联的 对象发送release消息,这样当view被释放的时候,view的所有子视图也能被释放。


6.版本问题:但是在ios6当中已经不像低版本那样处理低内存警告了,并且弃用了viewDidUnload方法。官方文档:

viewWillUnload

Called just before releasing the controller’s view from memory. (Deprecated in iOS 6.0. Views are no longer purged under low-memory conditions and so this method is never called.)


7.总结一下旧版本的UIViewCotroller的view的生命周期:

使用到view ---> view是否存在 ---> 不存在则UIViewControllr收到loadView,接着收到viewDidLoad  (存在则直接跳到下一步 )---->收到viewWillAppear:----> 收到viewDidaAppear  ----> view可见 ---->这时候出现内存警告 ---->收到didReceiveMemoryWarning -----这时如果没覆盖didReceiveMemoryWarning或覆盖没改变默认实现 ,则不做任何动作 ---->当要移除view时,会收到viewWillDisappear ----->接着收到viewDidDisappea ----->这时候view不可见了,在这时如果有内存警告---->收到didReceiveMemoryWaring----->默认实现为:实例变量view被release并设为nil -----> 收到viewDidUnload ---->使用到view.(回到第一步)....




0 0
原创粉丝点击