UIViewController生命周期UIViewController的生命周期本质上就是一个页面从“创建 → 显示 → 消失 → 销毁”的全过程。开发中最常用的几个方法一、整体调用顺序通常一个页面出现时init ↓ loadView ↓ viewDidLoad ↓ viewWillAppear ↓ viewWillLayoutSubviews ↓ viewDidLayoutSubviews ↓ viewDidAppear页面离开时viewWillDisappear ↓ viewDidDisappear ↓ dealloc二、每个方法的作用1.init-(instancetype)init调用时机对象刚调用时调用作用初始化数据常用于初始化属性创建数据数组设置默认值注意view还没创建不能操作界面2.loadView-(void)loadView调用时机第一次访问self.view时调用作用创建控制器的根视图系统自动创建一个view什么时候重写完全代码创建UI不用 storyboard/xib注意如果通过覆写loadview方法创建了自定义UI需要牢记将view视图设置到视图层级的根上确保视图正在被其他视图控制器共享不要调用[super loadView]self.viewxxx;一般开发不建议重写loadview3.viewDidLoad-(void)viewDidLoad调用时机view加载完成后调用特点整个生命周期只调用一次适合做什么创建UI添加控件Masonry布局注册cell网络请求初始化页面数据4.viewWillAppear-(void)viewWillAppear:(BOOL)animated调用时机当视图层级已经准备好且视图即将被放入视图窗口时此方法会被调用。在即将展示视图控制器或之前入栈modal或者其他的视图控制器弹出时这种情况就会发生。在这个时刻过渡动画还未开始视图对终端用户也是不可见的。不要启动任何视图动画因为没有任何作用特点每次页面出现时都会调用适合做什么刷新数据更新UI隐藏导航栏修改状态栏注意页面还没真正显示动画还没开始5.viewDidAppear-(void)viewDidAppear:(BOOL)animated调用时机当视图在视图窗口展示出来且过渡动画完成后此方法会被调用。因为动画会耗费约300毫秒所以对比viewWillAppear和viewDidLoadviewDidAppear和viewWillDisappear之间的时间差可能会比较大。适合做什么开始动画播放视频开启定时器开始监听6.viewWillDisappear-(void)viewWillDisappear:(BOOL)animated调用时机该方法表示视图将要从屏幕上隐藏起来。这可能是因为其他视图控制器想要接管屏幕或该视图控制器将要出栈。你可能会注意到当此方法被调用时没有办法能直接够判断这是由当前视图控制器要出栈还是其他视图控制器入栈导致的。适合做什么暂停动画停止定时器收起键盘保存数据7.viewDidDisappear-(void)viewDidDisappear:(BOOL)animated调用时机页面已经消失适合做什么停止视频移除通知释放大资源8.dealloc-(void)dealloc调用时机控制器被释放时适合做什么移除通知观察者释放查看是否内存泄漏-(void)dealloc{[[NSNotificationCenter defaultCenter]removeObserver:self];}三、loadView和viewDidLoad区别loadView负责“创建 view”viewDidLoad负责“view 创建完成后的初始化”控制器里有一个最重要的属性property(nonatomic, strong) UIView *view;UIViewController 的工作管理一个根view当页面要显示时如果view不存在 ↓ 先创建view ↓ 再进行初始化 ↓ 再显示页面于是loadView负责创建viewviewDidLoad负责view创建完成后的处理总结UIViewController生命周期(void)initialize函数并不会每次创建对象都调用只有在第一次初始化的时候才会调用再次创建将不会调用initialize方法。init方法和initCoder方法相似知识被调用的环境不一样。如果用代码初始化会调用init方法从nib文件或者归档(xib、storyboard)进行初始化会调用initCoder。initCoder是NSCoding协议中的方法NSCoding是负责编码解码归档处理的协议。loadView是开始加载view的起始方法除非手动调用否则在ViewController的生命周期中只调用一次。viewDidLoad是我们最常用的方法类成员对象和变量的初始化我们都会放在这个方法中。在创建类后无论视图展现还是消失这个方法也只会在布局是调用一次。viewWillAppear:(BOOL)animated方法 是在视图将要展现出来的时候调用。viewWillLayoutSubviews方法是在将要布局子视图的时候调用。viewDidLayoutSubviews方法是在子视图布局完成后调用。viewDidAppear:(BOOL)animated方法是视图已经出现。viewWillDisappear:(BOOL)animated方法是视图即将消失。viewDidDisappear:(BOOL)animated视图已经消失。deallocViewController被释放时调用