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

iOS - ViewController生命周期

2016-08-19 11:26 295 查看

from:http://www.jianshu.com/p/fcfbd4919b0b

viewcontroller的生命周期关乎着数据的保存,view的刷新等,very important

一、 ARC环境

单个viewController的生命周期

initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)

loadView:加载view

viewDidLoad:view加载完毕

viewWillAppear:控制器的view将要显示

viewWillLayoutSubviews:控制器的view将要布局子控件(在这个方法里,部署需要改变重新刷新view的代码,功能类似view的layoutSubViews()这个方法,需要注意的是,这个方法里一般都需要重置的view的frame,宽度和高度的获取,因此view的frame一般都写在这个方法里)

viewDidLayoutSubviews:控制器的view布局子控件完成
这期间系统可能会多次调用viewWillLayoutSubviews 、    viewDidLayoutSubviews 俩个方法


viewDidAppear:控制器的view完全显示

viewWillDisappear:控制器的view即将消失的时候
这期间系统也会调用viewWillLayoutSubviews 、viewDidLayoutSubviews 两个方法


viewDidDisappear:控制器的view完全消失的时候

多个viewControllers跳转

当我们点击push的时候首先会加载下一个界面然后才会调用界面的消失方法

initWithCoder:(NSCoder *)aDecoder:
ViewController2
(如果用xib创建的情况下)

loadView:
ViewController2


viewDidLoad:
ViewController2


viewWillDisappear:ViewController1 将要消失

viewWillAppear:
ViewController2
将要出现

viewWillLayoutSubviews
ViewController2


viewDidLayoutSubviews
ViewController2


viewWillLayoutSubviews:ViewController1

viewDidLayoutSubviews:ViewController1

viewDidDisappear:ViewController1 完全消失

viewDidAppear:
ViewController2
完全出现

小结:
-整个控制器声明周期: viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear

二、非ARC环境下

didReceiveMemoryWarning:

当app收到内存警告的时候会发消息给视图控制器。

app从来不会直接调用这个方法,而是当系统确定可用内存不足的时候采取调用。

如果你想覆写这个方法来释放一些控制器使用的额外内存,你应该在你的实现方法中调用父类的实现方法


viewWillUnload:
(iOS6废除)


当消除掉控制器的视图之前调用

视图不会再在低内存条件下被清除所以这个方法不会再被调用。

在iOS5之前,当低的内存情况发生的时候,当前控制器的视图们不再被需要的时候,系统会有选择性的将这些视图从这些内存移除。这个方法被调用的目的是在视图被真正的销毁前你可以执行一些清空的任务。比如,
你想要使用这个方法去清空视图的观察者或通知或者记录视图的状态以便当重新读取的时候恢复。


在iOS6之后,不再需要清空视图的引用。因此,其他一些关于清理的方法,比如清空观察者,也不是必要的了。

viewDidUnload:
(iOS6废除)


当视图从内存中被消除后调用

视图在地的内存情况下不再被销毁所以这个方法也不再会调用

在iOS5之前,地的内存状况发生之后,当前的试图控制器的视图不再被需要,系统会选择性的在视图控制器的视图被销毁后调用。这个方法使你执行一些最后清空任务的最后机会如果你的视图控制器存储着对视图的或子控件的单独引用,你应该使用这个方法去释放这些引用。
你也可以使用这个方法去消除一些你再创建视图时候所创建的但是当视图不再的时候不再需要的关于对象的引用。你不应该使用这个方法去释放用户数据或者一些不能轻易被重新创建的数据。


在iOS6之后,清空在试图控制器中对views和其他对象的引用已经没有必要了。

当这个方法被调用的时候,视图的属性是空的。

文/Mitchell(简书作者)
原文链接:http://www.jianshu.com/p/fcfbd4919b0b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: