iOS 控制器ViewController的生命周期,以及各个方法调用的顺序

所谓控制器的生命周期,无非就是几个方法的调用顺序(如下方法按照顺序执行):

  • 加载根视图
/* 加载根视图 */
- (void)loadView {
    [super loadView];
    //控制器的根视图View是懒加载的;
    //加载View,创建View,优先级最高;
    //从nib载入视图,通常这一步不需要去干涉。除非你没有使用xib文件创建视图。(在定制 VC 时,如果覆盖loadView方法,不需要调用[super loadView] 方法
    //1.如果你要重写loadView,可以自定义一个与系统不一样的View
    //2.可以在根视图中添加一些一些子视图
    NSLog(@"%s",__FUNCTION__);

}
  • 控制器加载完毕的时候
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.可以为控制器自定义数据,数据加载
    //2.动态创建其他控件(同名南昌会在这里做各种初始数据的载入,初始设定等很多内容)
    NSLog(@"%s",__FUNCTION__);
}
  • 控制器的View即将显示
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //进行一些显示前的处理,比如键盘弹出,一些特殊过程动画,比如状态栏和* navigationbar*的颜色等
    //不会调整初始状态的界面布局;
    //在视图要展示出来之前,做些准备操作,约束还没生效;
     NSLog(@"%s",__FUNCTION__);
}

在- (void)viewWillAppear:(BOOL)animated 与 - (void)viewDidAppear:(BOOL)animated 之间还要执行两个关键的方法:

  • 根视图即将布局子视图
/* 根视图即将布局子视图 */
- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
      //Subviews的布局调整完毕之前要做的一些事情;
    /* 在根视图或者它的子视图的frame值发生改变 */
    /* 或者当前屏幕的状态发生改变时调用 */
    NSLog(@"%s",__FUNCTION__);
}
  • 根视图已经完成子视图的布局
/* 根视图已经完成子视图的布局 */
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    //Subviews的布局调整完毕之后要做的一些事情;
      /* 比如,一旦imageView的frame值改变,切圆角的操作就放在这里进行 */
    NSLog(@"%s",__FUNCTION__);
    
}
  • 控制器的View已经显示
/* 控制器的View已经显示 */
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    //视图展示出来之后,约束已经生效;
    NSLog(@"%s",__FUNCTION__);
    
}
  • 控制器的View即将消失
/* 控制器的View即将消失*/
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //视图即将从屏幕移除之前执行,此时还没有调用`removeFromSuperview`,视图即将被移除,覆盖时会在这里做一些善后处理和设置
     NSLog(@"%s",__FUNCTION__);
    
}
  • 控制器的View已经消失
/* 控制器的View已经消失*/
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    //视图已经从屏幕上移除了,用户看不到这个视图了。此时已调用removeFromSuperview。
    //释放一些不再需要的资源,与UI显示有关的资源
    NSLog(@"%s",__FUNCTION__);
    
}

  • 接收到内存警告
/* 接收到内存警告 */
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"%s",__FUNCTION__);
}

过时的方法 iOS6.0 之前

  • 即将销毁View
/* 即将销毁View */
- (void)viewWillUnload {
    // 发生内存警告时,在对其他视图销毁前调用。
    //销毁View
    NSLog(@"%s",__FUNCTION__);
}
  • 已经销毁View
/* 已经销毁View */
- (void)viewDidUnload {
    //发生内存警告时,如果视图不是当前屏幕正在显示的视图,viewDidUnload将会被执行,本视图所有子视图将被销毁以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建的对象释放内存。因为当这个视图再次显示在屏幕上的时候viewLoad、viewDidLoad会再次被调用。
    //销毁一些不必要的属性 和数据
    NSLog(@"%s",__FUNCTION__);
}

** 给各个控制器view子控件添加约束**


iOS 控制器ViewController的生命周期,以及各个方法调用的顺序_第1张图片
图一.png

程序第一次运行,显示第一个控制器的时候,按照如下顺序执行:


iOS 控制器ViewController的生命周期,以及各个方法调用的顺序_第2张图片
输出台1.png

由第一个控制器右上角item按钮跳到第二个控制器的时候,执行打印:


iOS 控制器ViewController的生命周期,以及各个方法调用的顺序_第3张图片
输出台2.png

由第二个控制器View中的button按钮跳到第三个控制器的时候,执行打印:


iOS 控制器ViewController的生命周期,以及各个方法调用的顺序_第4张图片
输出台3.png

第二个控制器返回至第一个控制器的执行打印:


iOS 控制器ViewController的生命周期,以及各个方法调用的顺序_第5张图片
输出台4.png

第三个控制器返回至第二个控制器的执行打印:


iOS 控制器ViewController的生命周期,以及各个方法调用的顺序_第6张图片
输出台5.png

源码链接

参考文献

UIViewController的生命周期及iOS程序执行顺序
:学豆-控制器的生命周期

你可能感兴趣的:(iOS 控制器ViewController的生命周期,以及各个方法调用的顺序)