控制器的生命周期

1>  概念:控制器的view的生命周期方法都是以view开头的。

2>  控制器view的加载

计算机生成了可选文字:
view property 
is accessed 
NO 
Is there 
loadView 
a view? 
Custom 
Method? 
YES 
Storyboard 
load from 
empty view 
storyboard 
viewDidLoad 
return view 
YES 
custom method 
View Controller 
view 
View Controller 
view 
nil 
View

        当控制器要加载一个view时,首先判断是否已有view,如果有,则直接return;如果没有,则调用loadView方法(参考下面第3点);

3>  控制器的view的创建(调用loadView方法时)

计算机生成了可选文字:
MJViewControllerffJview$JÉlJa 
NO 
loadView 
YES 
storyboard 
NO 
n ibName 
NO 
MJView.xib 
NO 
MJViewContr011er.xib 
NO 
YES 
YES 
YES 
iew. 
YES 
MJViewController.

        当创建view的时候,首先看我们有没有自定义loadView,如果重写了loadView方法,就根据loadView的代码实现去创建,如果没有自定义loadView,就看有没有storyboard文件;

        如果有storyboard,那么就根据storyboard的描述去创建,如果没有storyboard,就看有没有跟代码中输入的nibName同名的xib文件;

        如果有找到nibName代码输入的xib文件,就根据nibName对应的xib的描述去创建,如果没有找到nibName中的xib文件,就看有没有跟控制器类名同名且不带controllerview.xib文件;

        如果有跟控制器类名同名且不带controllerview.xib文件,就根据view.xib的描述去创建,如果没有,就看有没有跟控制器类名同名的viewController.xib文件;

        如果有跟控制器类名同名的viewController.xib文件,就根据viewController.xib的描述去创建,如果没有,就创建一个空的view

注意点:

  • 控制器的view是延迟加载的:用到时再加载
  • 可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
  • 控制器的view加载完毕就会调用viewDidLoad方法
  • 当通过代码方式去创建view时,在loadView方法中不应该调用super,如果调用[super  loadView]会影响性能;使用创建的viewself.view进行赋值

4>  内存警告处理

计算机生成了可选文字:
Memory warning 
did ReceiveMemo ryWa rn ing 
YES 
Is there 
a view? 
Can it be 
released? 
YES 
viewWil IUnLoad 
release the view 
viewDidUnLoad 
View Controller 
view 
outlet 
View Controller 
view 
outlet 
View Controller 
view 
outlet 
View 
Subview 
nil 
Subview 
nil 
nil

        当系统发出内存警告时,会调用didReceiveMemoryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,完成viewrelease

5>  生命周期执行流程:

Init -> loadView -> viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> viewWillUnload -> viewDidUnload -> dealloc

注:在非ARCviewDidUnload,经常用来清空界面上的数据

6>  小结

loadViewviewDidLoad的区别:

        loadView 方法在控制器的 view 为 nil 的时候被调用。 此方法用于以编程的方式创建 view 的时候用到。loadView 是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。loadView只会被调用一次。

        viewDidLoad 方法只有当 view 从 nib 文件初始化的时候才被调用。 viewDidLoad 用于初始化,加载时用到。viewDidLoad可能会被调用多次。

原文地址:https://www.cnblogs.com/sjxjjx/p/5001626.html