iOS视图控制对象生命周期

来源:互联网 发布:2016网络大电影市场 编辑:程序博客网 时间:2024/05/18 01:12

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] loadView2016-01-07 15:12:27.831 iOS_Life[1504:212313] viewDidLoad2016-01-07 15:12:27.831 iOS_Life[1504:212313] viewWillAppear2016-01-07 15:12:27.837 iOS_Life[1504:212313] viewWillLayoutSubviews2016-01-07 15:12:27.837 iOS_Life[1504:212313] viewDidLayoutSubviews2016-01-07 15:12:27.839 iOS_Life[1504:212313] viewWillLayoutSubviews2016-01-07 15:12:27.839 iOS_Life[1504:212313] viewDidLayoutSubviews2016-01-07 15:12:27.843 iOS_Life[1504:212313] viewDidAppear//点击跳转之后,执行的函数如下:2016-01-07 15:13:28.184 iOS_Life[1504:212313] viewWillDisappear2016-01-07 15:13:28.187 iOS_Life[1504:212313] viewWillLayoutSubviews2016-01-07 15:13:28.187 iOS_Life[1504:212313] viewDidLayoutSubviews2016-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
原创粉丝点击