微信号:rigongyizu365

介绍:一线码农不端不装的「日拱一卒」,关注技术、书籍、创业、GTD、以及一切个人成长周边的话题,每周一到五更新.

UIViewController(视图控制器)的生命周期

2015-07-03 20:11 lazybios

UIViewController(视图控制器)的生命周期

UIView(视图)是iOS App与外界交互的窗户,可能也是在开发过程中使用最多的部分。(UIViewController)视图控制器则是视图的管理者,其职责:对内管理与之关联的View,对外跟其他ViewController通信和协调。如同App的生命周期一样,每一个视图控制器也都有一个从生到灭的生命周期。在编写应用界面交互的过程,就是合理利用每个生命周期的特性,做出符合应用行为规范的操作。

UIViewController 生命周期顺序

  • (void)loadView

  • (void)viewDidLoad

  • (void)viewWillAppear

  • (void)viewDidAppear

  • (void)viewWillLayoutSubviews

  • (void)viewDidLayoutSubviews

  • (void)viewWillDisappear

  • (void)viewDidDisappear

  • (void)didReceiveMemoryWarning

- (void)loadView

创建视图控制器管理的视图,该方法不会被直接调用,只有当视图控制器去请求相应地view属性时,并且此时的viewnil,才会去调用该方法进行加载或者创建对应的视图并赋值给view属性。顺序大概是:

如果通过initWithNibName:bundle方法指定了nib文件名,那么直接加载该文件。如果initWithNibName:bundlename参数是nil,视图控制器会查找,与之同名的nib文件,如果存在则进行加载,如果没有则自动创建一个空白的UIView

- (void)viewDidLoad

在视图控制器被加载到内存中以后,每个生命周期只会被调用一次。对于视图相关得一次性初始化操作往往在这里进行。不过在这里进行几何类操作是不恰当的,因为在视图控制器加载到内存时,还没有显示到界面中,视图的边界还没有被确定下来,那么基于此的View创建操作也一定会是错误的。

- (void)viewWillAppear:(BOOL)animated 

当viewWillAppear将要被调用的时候,代表你的视图就要在屏幕上显示了。这一步的时候,你的视图界面边界已经得到确定,可以绘制一些几何图形了。不过,设备的朝向还没有被指定好。这个阶段适合放一些针对界面的非一次性的初始化操作,以及当在视图不可见时,数据模型发生变化,回到视图时需要重新同步视图UI和数据模型,以保持二者一致。

因为往往一个App会包含多个视图,往往会出现视图间交互出现的情况,所以这个函数也会被多次调用到,这也是为什么不适合一次性初始化的原因。

- (void)viewDidAppear:(BOOL)animated

viewWillAppear想对应,在当视图在屏幕上完全显示后,该方法被调用,因为此时视图已经被呈现出来了,所以此处可以放置一些视图呈现相关得操作,比如为视图增加一些动画效果等,亦或者用来加载请求一些数据。

- (void)viewWillLayoutSubviews 

在视图控制的子视图将要呈现的时候被调用,另外由于frame改变而触发重新呈现subview之前,该方法也会被调用,最常见的情况就是横屏切换时,其时这个时机仍然可以概括位子视图将要输出时。

- (void)viewDidLayoutSubviews 

与之前的viewWillLayoutSubviews 相对应,在子视图被正确放置到视图控制器对应的视图中时被调用。

- (void)viewWillDisappear:(BOOL)animated

与之前的装载视图相反,该方法是在视图即将被从视图控制器上拿下时调用的。可以在该方法中进行诸如确认编辑,释放视图的第一响应状态。同时此处也可以用来恢复在viewDidDisappear:中,进行的状态冻结操作。

- (void)viewDidDisappear:(BOOL)animated

此方法是上面方法的Did版本,视图被拿下之后进行次调用,在此可以做一些状态保存工作,保存应用UI在消失之前的一些基本状态。

- (void)didReceiveMemoryWarning

iOS在内存吃紧的时候会对那些内存持有大户进行封杀,当内存紧张的时候会发出这个调用,如果你正是iOS系统追杀的内存大户,那么当收到该消息,可以在此进行一些必要的内存释放,以免除被系统强行Kill的下场。不过严格意义上讲,这个状态不算是生命周期的一部分,因为并不是每个应用都会收到该消息。

上面方法中,除了viewDidLoad在应用运行时只调用一次以外,其余方法都会被反复调用。如下图:


参考引用

http://t.cn/RLzRrlH


 
日拱一卒 更多文章 使用Retry处理异常的套路 | Ruby 视图的使用 101 | MySQL 使用存储过程 | MySQL 触发器的使用 | MySQL 什么是康威定律 | 三分钟
猜您喜欢 iOS设计模式之三:适配器模式和观察者模式 Docker在PHP项目开发环境中的应用 终端环境下更好用的文件比较差异工具icdiff 理解ionic2 + angular2开发方案 【互联网前沿】宋哲:网络产品界面的知识产权保护问题