1> 概念:控制器的view的生命周期方法都是以view开头的。
2> 控制器view的加载
当控制器要加载一个view时,首先判断是否已有view,如果有,则直接return;如果没有,则调用loadView方法(参考下面第3点);
3> 控制器的view的创建(调用loadView方法时)
当创建view的时候,首先看我们有没有自定义loadView,如果重写了loadView方法,就根据loadView的代码实现去创建,如果没有自定义loadView,就看有没有storyboard文件;
如果有storyboard,那么就根据storyboard的描述去创建,如果没有storyboard,就看有没有跟代码中输入的nibName同名的xib文件;
如果有找到nibName代码输入的xib文件,就根据nibName对应的xib的描述去创建,如果没有找到nibName中的xib文件,就看有没有跟控制器类名同名且不带controller的view.xib文件;
如果有跟控制器类名同名且不带controller的view.xib文件,就根据view.xib的描述去创建,如果没有,就看有没有跟控制器类名同名的viewController.xib文件;
如果有跟控制器类名同名的viewController.xib文件,就根据viewController.xib的描述去创建,如果没有,就创建一个空的view。
注意点:
- 控制器的view是延迟加载的:用到时再加载
- 可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
- 控制器的view加载完毕就会调用viewDidLoad方法
- 当通过代码方式去创建view时,在loadView方法中不应该调用super,如果调用[super loadView]会影响性能;使用创建的view对self.view进行赋值
4> 内存警告处理
当系统发出内存警告时,会调用didReceiveMemoryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,完成view的release。
5> 生命周期执行流程:
Init -> loadView -> viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> viewWillUnload -> viewDidUnload -> dealloc
注:在非ARC中viewDidUnload,经常用来清空界面上的数据
6> 小结
loadView和viewDidLoad的区别:
loadView 方法在控制器的 view 为 nil 的时候被调用。 此方法用于以编程的方式创建 view 的时候用到。loadView 是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。loadView只会被调用一次。
viewDidLoad 方法只有当 view 从 nib 文件初始化的时候才被调用。 viewDidLoad 用于初始化,加载时用到。viewDidLoad可能会被调用多次。