View Controller Lifecycle

PS: 序号表示调用顺序。
1:init/initWithNib...

  • 初始化方法
  • 如果使用storyboard创建控制器,则不会调用该方法

2: awakeFromNib

  • 使用storyboard创建控制器时会调用
  • 此时的outlet还没有设置好
  • 可以做一些不需要在viewDidLoad做的setup工作

3: loadView

  • 创建self.view
  • 此时 self.view = nil
  • 如果使用nib的方式创建的控制器,则会从nib中加载,不需要重写该方法,但是还是会调用
  • 如果不是,则默认会创建一个plain view。
  • 手动创建view时不需要调用super的方法

4: viewDidLoad

  • 控制器实例化,self.view加载完毕,outlet设置完毕后调用
  • 整个生命周期只会调用一次,所以适合做setup工作,如self.view的配置,控件添加等一次性初始化工作。
  • 不要添加任何frame相关,因为此时的self.view的frame未知。

5: viewWillAppear

  • 通知控制器它的view即将被添加到视图层。
  • 每次视图重新回到屏幕上都会被调用。
  • 所有view加载完毕,动画还未被添加到对应的view上。
  • 可以在该方法中设置所有view的frame等属性以及状态栏等,但不是最好的地方。
  • 可以进行数据同步,动画启动,状态恢复等操作。
  • 如果在这里创建view,可能会导致view延迟显示。
  • 如果viewController以弹出框的形式被present,则dismiss时,原控制器不会调用这个方法。

6: viewWillLayoutSubviews

  • 通知控制器它的view将要对subviews进行布局
  • layoutSubviews 方法调用之前调用,即self.view尺寸发生变化时。
  • 可以在这里或者6进行frame'相关的设置。

7: viewDidLayoutSubviews

  • 通知控制器它的view已经完成对subviews进行布局
  • 如果在这之前所创建的view没有设置约束,建议在该方法内修改视图的frame,以适配不同大小的屏幕。

8: viewWillDisappear

  • 通知控制器它的view即将从视图层中移除
  • 在控制器的view被移除视图层(dismissed,covered,hidden)以及所有动画被配置前调用。
  • 可以做一些停止工作,以减少内存占用(用户体验),如动画停止。
  • 可以做状态保存,如记录滚动视图的滚动位置(控件状态),数据保存。
  • 可对要移除的view做一些处理,如键盘事件。

9: viewDidUnload

  • 内存不足时会调用,现在一般使用didReceiveMemoryWarning方法,该方法基本不使用。

10: didReceiveMemoryWarning

  • 你需要在该方法内释放堆中的内存。
  • 图像,视频,声音会占用较多的内存,优先释放。注意不要释放当前屏幕上正在显示或播放的内容。

11: dealloc

  • 释放资源

你可能感兴趣的:(View Controller Lifecycle)