由于控制器的初始化方式不同,触发的函数略有不同。
如果控制器是直接通过代码
或者XIB
创建出来的,并且调用方法为[[ViewController alloc] init]
创建VC的生命周期为:
-[ViewController initWithNibName:bundle:]
-[ViewController init]
-[ViewController loadView]
如果是通过Storyboard
创建的控制器,那么VC的生命周期为:
-[ViewController initWithCoder:]
-[ViewController awakeFromNib]
-[ViewController loadView]
ViewController在loadView
函数之后,函数的调用顺序如下:
// 视图控制器开始加载
loadView// 决定当前控制器的根视图是什么,如果不主动设置,控制器会自动创建一个UIView作为根视图
viewDidLoad
viewWillAppear
viewDidAppear
// 视图消失时
viewWillDisappear
viewDidDisappear
// 当收到内存警告时
didReceiveMemoryWarning
viewDidUnload
// 如果收到内存警告视图被释放了后,再次显示此页面时,会再次从loadView开始调用
// 控制销毁时
dealloc
loadView详解:苹果设计这个方法就是给我们自定义UIViewController的view用的。在view创建完毕后,最终都会调用viewDidLoad方法。一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用。
流程表示如下:
- 第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view
- view创建完毕后会调用viewDidLoad方法进行界面元素的初始化
- 当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法
- 当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view
- view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化
3.1 谈谈UIView的生命周期。
如果纯代码创建UIView,调用方式为[[UIView alloc] init]
那么它的生命周期为:
-[UIView initWithFrame:]
-[UIView init]
-[UIView layoutSubviews]
如果纯代码创建UIView,调用方式为[[UIView alloc] initWithFrame:frame]
那么它的生命周期为:
-[UIView initWithFrame:]
-[UIView layoutSubviews]
如果通过XIB
创建UIView,调用方式为[[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil] lastObject]
那么它的生命周期为:
-[CustomView initWithCoder:]
-[CustomView awakeFromNib]
-[CustomView layoutSubviews]