iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途
init-初始化程序
viewDidLoad-加载视图
viewWillAppear-UIViewController对象的视图即将加入窗口时调用;
viewDidApper-UIViewController对象的视图已经加入到窗口时调用;
viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;
viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;
viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。
视图控制对象通过alloc和init来创建,但是视图控制对象不会在创建的那一刻就马上创建相应的视图,而是等到需要使用的时候才通过调用loadView来创建,这样的做法能提高内存的使用率。比如,当某个标签有很多UIViewController对象,那么对于任何一个UIViewController对象的视图,只有相应的标签被选中时才会被创建出来。
比如如下代码:
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- // Custom initialization
- UITabBarItem *tbi = [self tabBarItem];
- [tbi setTitle:@"CurrentTime"];
- [[self view ] setBackgroundColor:[UIColor yellowColor]];
- }
- return self;
- }
我们将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。
这样,一套的流程就完成了,不知道写的是否详细。。。。
iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途的更多相关文章
- IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...
- _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- iOS视图控制对象生命周期
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- iOS视图控制器的生命周期
今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...
- [ IOS ] 视图控制对象ViewController的生命周期
init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewContro ...
- iOS 生命周期 -init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 区别和用途
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- iOS开发-ViewController的生命周期和切换
ViewController在App开发中是至关重要的一环,无论是页面的展示和数据之间的交互,ViewController提供了一个框架可以管理和构建App应用.iOS中构建App提供了两种方式一种是 ...
- IOS 控件的生命周期
ViewController的生命周期包括: Initialize ViewDidLoad ViewWillAppear ViewDidAppear ViewWillDisappear ViewDid ...
随机推荐
- AES加密跨平台出现的问题
javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.S ...
- c++ smart pointer
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference ...
- 【HDOJ】2333 Assemble
二分+贪心策略.其中注释处很重要. #include <iostream> #include <cstdio> #include <cstring> #includ ...
- Linux&shell 之Shell命令进阶
写在前面:案例.常用.归类.解释说明.(By Jim) 监控程序a.进程查看ps -ef(-e表示系统上运行的所有进程,-f用于扩展输出一些有用的信息列.)ps -efH(-H参数可以将进程组织为分层 ...
- BZOJ 1072 [SCOI2007]排列perm
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1268 Solved: 782[Submit][Sta ...
- PHP去除空白字符
例子1: <?php $var = " This is a beautiful day!"; // 删除字符串中的所有空白字符(不包括全角空格) $var1 = preg_r ...
- 字符串(多串后缀自动机):HDU 4436 str2int
str2int Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- iOS 沙盒路径操作:新建/删除文件和文件夹
http://blog.csdn.net/totogo2010/article/details/7671144
- 《JavaScript语言精髓与编程实践》读书笔记二
第3章非函数式语言特性 这一章首先介绍了语言的分类,命令式(结构化编程,面向对象编程),说明式(函数式等).而这一章,主要介绍JS的非函数式特点. 在开始之前,首先介绍了由“结构化编程”向“面向对象编 ...
- Java Struts文件上传和下载详解
Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...