IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

简介: iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIV...

iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途

init-初始化程序

viewDidLoad-加载视图

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

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

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

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

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

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

  

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

 

比如如下代码:

[plain]  view plain copy
 
  1. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  2. {  
  3.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  4.     if (self) {  
  5.         // Custom initialization  
  6.         UITabBarItem *tbi = [self tabBarItem];  
  7.         [tbi setTitle:@"CurrentTime"];  
  8.         [[self view ] setBackgroundColor:[UIColor yellowColor]];  
  9.         }  
  10.     return self;  
  11. }  

 

我们将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。

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

 

还有看的不明白的,可以取下我的小Demo: http://download.csdn.net/detail/weasleyqi/4664799,在CurrentTimeViewController.m当中详细的log都写好了,大家可以取研究研究。

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
3月前
|
安全 Android开发 数据安全/隐私保护
请说明鸿蒙操作系统与其他操作系统(如Android和iOS)的主要区别。
请说明鸿蒙操作系统与其他操作系统(如Android和iOS)的主要区别。
58 1
|
2月前
|
Java 测试技术 API
安卓APP和iOS APP在测试上的区别是什么?
安卓APP和iOS APP在测试上的区别是什么?
|
3月前
|
iOS开发
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
26 1
|
3月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
65 0
|
11月前
|
机器学习/深度学习 API iOS开发
iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型
上一篇文章中,我们介绍了几个官方的图片分类的模型,图片分类模型的应用场景在于将图片中最主要的事物进行识别,在已有的词库中找到最可能得事物。而对象识别则要更高级一些。再之前的文章,我们介绍过可以使用官方提供的API来进行矩形识别,文本识别,二维码识别以及人脸识别等,这类识别功能的特点是我们不仅可以将图片中的物体位置和尺寸分析出来,还可以对其进行类别的分类。
248 0
|
8月前
|
Shell iOS开发
iOS 逆向编程(十)sh脚本(shell)编写与执行指令区别
iOS 逆向编程(十)sh脚本(shell)编写与执行指令区别
174 0
|
8月前
|
安全 小程序 iOS开发
iOS Odyssey 和 unc0ver 的区别
iOS Odyssey 和 unc0ver 的区别
402 0
|
11月前
|
程序员 iOS开发
iOS App的生命周期
iOS App的生命周期
259 0
|
iOS开发
iOS开发-加在透明视图上的控件会透明
iOS开发-加在透明视图上的控件会透明
112 0
|
存储 Unix 编译器