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
- 释放资源