您的位置:首页 > 移动开发 > IOS开发

iOS视图控制对象生命周期及其作用

2015-10-08 20:29 435 查看
iOS视图控制对象生命周期 :

init;

viewDidLoad;

viewWillAppear;

viewWillLayoutSubviews;

viewDidAppear;

viewWillDisappear;

viewDidDisappear;

总有朋友问我,哎,我说这个方法咋没走啊?我非常无奈的说,大哥,这里是页面被覆盖时才走。

网上已经有很多这类文章了,但是要不是表述不明确,就是时间太长,很多方法都被弃用了,今天我特意写一篇,供大家参考。

init-初始化程序(一些数组,字典啥的可以在这里初始化)

viewDidLoad-加载视图(顺道说一句,现实数据加载然后铺界面)

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

viewWillLayoutSubviews - 鋪上面的控件(不是只走一遍)

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

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

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

viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;(不过xcode7之后被弃用啦)

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来看:

2015-10-1 15:51:44.811inHyron[483:b903] init

2015-10-1 15:51:54.081inHyron[483:b903] viewDidLoad

2015-10-1 15:51:54.082inHyron[483:b903] viewVillAppear

2015-10-1 15:51:54.084 inHyron[483:b903] viewDidAppear

很明显,先执行init、然后执行viewDidLoad,然后是viewWillAppear最后是viewDidAppear,这样视图就创建好了,当视图消失或者被覆盖的时候:

2015-10-1 15:54:14.557inHyron[483:b903] viewWillDisappear

2015-10-1 15:54:14.558inHyron[483:b903] viewDidDisappear

这样一来视图就消失了,当模拟内存警告的时候:

2015-10-1 15:55:14.333inHyron[483:b903] Received simulated memory warning.

2015-10-1 15:55:14.334inHyron[483:b903] viewWillUnload

2015-10-1 15:55:14.335 inHyron[483:b903]viewDidUnload

从log可以看出,当视图控制对象收到内存警告的时候,程序会执行viewWillUnload最后是执行viewDidUnload。

ViewController的生命周期中各方法执行流程如下:

init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload(在Xcode7.0就被弃用了)->viewDidUnload—>dealloc

当跳转页面再返回的时候,只走viewWillApper,viewDidApper.loadView只走一次.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息