[iOS开发]ViewController的生命周期

Posted Billy Miracle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[iOS开发]ViewController的生命周期相关的知识,希望对你有一定的参考价值。

在面向对象的语言中,是对象,就一定要有生命周期,UIViewController也不例外,生命周期管理Controller的作用范围和时间,也管理其内对象的作用范围和时间。

涉及函数

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

接下来,我们通过重写函数并输出来观察它们的执行顺序:

pressButton
SecondPageInitialize
SecondPageInit
SecondPageLoadView
SecondPageViewDidLoad
SecondPageViewWillAppear
SecondPageViewWillLayoutSubviews
SecondPageViewDidLayoutSubviews
SecondPageViewDidAppear
pressBackButton
SecondPageViewWillDisappear
SecondPageViewDidDisappear
SecondPageDealloc

点击第一个页面的按钮创建并present第二个页面,SecondPage从Initialize一直执行到ViewDidAppear。点击返回按钮,SecondPage最终被dealloc。
接下来,可以尝试重写FirstView的dealloc方法,可以看到,按下按钮并present第二个页面后,FirstView并没有被dealloc掉,这是因为:==VC1pushVC2或者presentVC2的时候, VC1不会dealloc(不会被释放);VC2popVC1或者dismissV1的时候, VC2会被dealloc掉。==本人尝试了一下,使用push和present,SecondPage的几个函数的执行顺序相同。
上面的这些就是SecondViewController完整的生命周期。

各函数介绍:

  1. initialize函数并不会每次创建对象都调用,只有在这个类第一次创建对象时才会调用,做一些类的准备工作,再次创建这个类的对象,initalize方法将不会被调用,对于这个类的子类,如果实现了initialize方法,在这个子类第一次创建对象时会调用自己的initalize方法,之后不会调用,如果没有实现,那么它的父类将替它再次调用一下自己的initialize方法,以后创建也都不会再调用。因此,如果我们有一些和这个相关的全局变量,可以在这里进行初始化。
  2. init方法和initCoder方法相似,只是被调用的环境不一样,如果用代码进行初始化,会调用init,从nib文件或者归档进行初始化,会调用initCoder。
  3. loadView方法是开始加载视图的起始方法,除非手动调用,否则在ViewController的生命周期中没特殊情况只会被调用一次。
  4. viewDidLoad方法是我们最常用的方法的,类中成员对象和变量的初始化我们都会放在这个方法中,在类创建后,无论视图的展现或消失,这个方法也是只会在将要布局时调用一次。
  5. viewWillAppare:视图将要展现时会调用。
  6. viewWillLayoutSubviews:在viewWillAppare后调用,将要对子视图进行布局。旋转屏幕时会被调用,调用addSubView:后会被触发,设置self.view及子视图的frame.size会被触发(前提是frame.size的值设置前后发生了变化),scrollView(有子视图)滚动会触发。
  7. viewDidLayoutSubviews:已经布局完成子视图。
  8. viewDidAppare:视图完成显示时调用。
  9. viewWillDisappare:视图将要消失时调用。
  10. viewDidDisappare:视图已经消失时调用。
  11. dealloc:controller被释放时调用。

Demo地址:https://github.com/BillyMiracle/ViewControllerLifeCycle.git

以上是关于[iOS开发]ViewController的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

viewController的生命周期

ViewController的生命周期分析和使用

iOS学习笔记—ViewController/生命周期

iOS:viewController 和 view 的生命周期

iOS - ViewController生命周期

[ IOS ] 视图控制对象ViewController的生命周期