视图控制器的生命周期就是一系列的方法,当事件发生时,就会被发送至UIViewController。我们创建的控制器就是UIViewController的子类,它会发送这些消息。
-
视图控制器的生命周期起始于创建
initWithNibName:这个方法是在controller的类在IB(Interface Builder,界面编辑器)中创建,但是通过Xcode实例化controller的时候用的。是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil。
loadNibNamed:即时加载,用该方法加载的xib对象中的各个元素都已经存在。
awakeFromNib:当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象时执行awakeFromNib。
initWithCoder :是一个类在IB中创建但在xocde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xcode中通过 initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.或者是一个view的nib文件,类似方法创建时调用initWithCoder。
在init中,不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。
LoadView
自定义View时使用这个方法。
每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。用来负责创建UIViewController的view。
它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view。
如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性。
如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],若没有xib文件,[super loadView]默认会创建一个空白的UIView。
ViewDidLoad
视图控制器已被实例化,在视图被加载到内存中的时候调用该方法,这个时候视图并未出现。在该方法中通常进行的是对所控制的视图进行初始化处理。不管是通过xib文件还是重写loadView创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法。
ViewWillAppear/ViewDidAppear
UIViewController对象的视图即将 / 已经加入窗口时调用。几何相关的代码,放在viewWillAppear里面,利于代码优化。
ViewWillDisappear/ViewDidDisappear
UIViewController对象的视图即将 / 已经消失,被覆盖或是隐藏时调用;
ViewWillUnload/ViewDidUnload
这两个方法已经被弃用;需要在didReceiveMomoryWarning释放控制器视图。
ViewWillLayoutSubviews/ViewDidLayoutSubviews