iOS视图控制对象生命周期

1.iOS视图控制器的生命周期

在面向对象的语言中,是对象,就一定要有生命周期,UIViewController也不例外,生命周期管理Controller的作用范围和时间,也管理其内对象的作用范围和时间。首先,UIViewController中与其生命周期有关的几个函数如下:

//类的初始化方法
+ (void)initialize;
//对象初始化方法
- (instancetype)init;
//从归档初始化
- (instancetype)initWithCoder:(NSCoder *)coder;
//加载视图
-(void)loadView;
//将要加载视图
- (void)viewDidLoad;
//将要布局子视图
-(void)viewWillLayoutSubviews;
//已经布局子视图
-(void)viewDidLayoutSubviews;
//内存警告
- (void)didReceiveMemoryWarning;
//已经展示
-(void)viewDidAppear:(BOOL)animated;
//将要展示
-(void)viewWillAppear:(BOOL)animated;
//将要消失
-(void)viewWillDisappear:(BOOL)animated;
//已经消失
-(void)viewDidDisappear:(BOOL)animated;
//被释放
-(void)dealloc;

除了initialize,init和initWithCoder不是存在所有对象的声明周期中,其他函数都会在UIViewController的声明周期中有序的被调用。那么具体的调用顺序是怎样的呢,最好的办法是实践一下,通过编号打印,结果如下:
这里写图片描述
注意:经过测试,从nib文件加载视图的controller,只要不释放,在每次viewWillAppear时都会调用layoutSubviews方法,有时甚至会在viewDidAppear后在调用一次layoutSubviews,而从代码加载视图的则只会在开始调用一次,之后都不会,所以注意,在layoutSubviews中写相关的布局代码十分危险。

2.视图控制器加载视图的过程

当你controller的view属性被第一次请求时,如果这时候view还不在内存里,就会触发对应的加载view的事件。先看下下图:
这里写图片描述
首先被调用的是loadView方法,这个方法是加载view的过程,如果你没有特殊需要不要乱重载此方法。loadView会判断并使用正确的代码来创建好一个view(见图),创建好了之后就触发viewDidLoad方法,这时候我们就可以做一些加载view之后的自定义操作了。viewDidLoad也处理完之后,controller的view属性就准备好了可以被各处调用了。

3.释放view的过程

  首先要说的是在iOS 6以后里面已经不会在收到memoryWarning的时候自动释放controller的view属性了,这点是和之前不用的一定要注意。系统会处理掉一些绘图用主要资源,来保证view所使用的内存尽量的小,所以一般情况下不需要太关心内存紧张的问题。一些释放资源的操作要从viewDidUnload里面挪出来放到didReceiveMemoryWarning里面了。

4.view视图在视图控制器生命中需要执行的方法的顺序

这里写图片描述

注意:iOS 6以后viewWillUnload和viewDidUnload这两个事件已经被废弃不会再被触发了。

跳转Demo:

一个ViewController跳到另外一个ViewController

//启动App之后:执行的函数如下:
2016-01-07 15:12:27.829 iOS_Life[1504:212313] loadView
2016-01-07 15:12:27.831 iOS_Life[1504:212313] viewDidLoad
2016-01-07 15:12:27.831 iOS_Life[1504:212313] viewWillAppear
2016-01-07 15:12:27.837 iOS_Life[1504:212313] viewWillLayoutSubviews
2016-01-07 15:12:27.837 iOS_Life[1504:212313] viewDidLayoutSubviews
2016-01-07 15:12:27.839 iOS_Life[1504:212313] viewWillLayoutSubviews
2016-01-07 15:12:27.839 iOS_Life[1504:212313] viewDidLayoutSubviews
2016-01-07 15:12:27.843 iOS_Life[1504:212313] viewDidAppear
//点击跳转之后,执行的函数如下:
2016-01-07 15:13:28.184 iOS_Life[1504:212313] viewWillDisappear
2016-01-07 15:13:28.187 iOS_Life[1504:212313] viewWillLayoutSubviews
2016-01-07 15:13:28.187 iOS_Life[1504:212313] viewDidLayoutSubviews
2016-01-07 15:13:28.702 iOS_Life[1504:212313] viewDidDisappear

一个ViewController跳到另外一个ViewController,和跳到某个网页这两种的区别在于:
跳转到另外一个ViewController是会执行viewWillDisappear等函数的,说明当前的视图消失。而跳到某个网页,没有执行viewWillDisappear等函数的,说明当前的视图并没有消失。

参考自:
http://www.cnblogs.com/JackieHoo/p/5065327.html
http://blog.csdn.net/hnuzengchao/article/details/50476566

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值