整理ViewController的生命周期和加载过程
Posted 锦夏ing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整理ViewController的生命周期和加载过程相关的知识,希望对你有一定的参考价值。
按照执行顺序排列
- initWithCoder:通过nib文件初始化时触发
- awakeFromNib:nib文件被加载的时候,会发送一个awakeFromNib的消息到nib文件中的每个对象
ps:
从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法。
从内存中alloc出来的情况下,调init方法。
从内存中alloc出来的情况下,调init方法。
- loadView:开始加载视图控制器自带的view 来生成UIViewController.view
- viewDidLoad:视图控制器的view被加载完成
PS:ViewController查找与其关联的view,其顺序是:
1 子类是否重写了loadView,是则直接调用。然后viewDidLoad完成View的加载。
2 如果子类没有重写的loadView,则ViewController会从StroyBoards中找或者调用其默认的loadView,默认的loadView返回一个空白的UIView对象
2 外部通过调用initWithNibName:bundle 指定nib文件名,ViewController加载此nib来创建View。
3 若外部initWithNibName:bundle 的name参数为nil即未指定nib文件名,
2 外部通过调用initWithNibName:bundle 指定nib文件名,ViewController加载此nib来创建View。
3 若外部initWithNibName:bundle 的name参数为nil即未指定nib文件名,
则ViewController会通过以下两个步骤找到与其关联的nib:
a): 如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib
b): 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib
b): 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib
4 如果子类没有重写的loadView,则ViewController会从StroyBoards中找或者调用其默认的loadView,默认的loadView返回一个空白的UIView对象
注:第一步,ViewController是判断子类是否重写了loadView,而不是判断调用子类的loadView之后ViewController的View是否为空。就是说,如果子类重写了loadView的话,不管子类在loadView里面能否获取到View,ViewController都会直接调viewDidLoad完成View的加载
注:第一步,ViewController是判断子类是否重写了loadView,而不是判断调用子类的loadView之后ViewController的View是否为空。就是说,如果子类重写了loadView的话,不管子类在loadView里面能否获取到View,ViewController都会直接调viewDidLoad完成View的加载
- viewWillAppear:视图控制器的view将要显示在window上
- updateViewConstraints:视图控制器的view开始更新AutoLayout约束
- viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置
- viewDidLayoutSubviews:视图控制器的view已经更新视图的位置
- viewDidAppear:视图控制器的view已经展现到window上
- viewWillDisappear:视图控制器的view将要从window上消失
- viewDidDisappear:视图控制器的view已经从window上消失
- (void)viewWillUnload;
- (void)viewDidUnload;
PS:view的Load和Unload不是成对调用的。
因为viewWillUnload和viewDidUnload这两个函数只在内存警告时被调用。
就算强制将viewController的view设为nil也不会触发。
如果viewController从创建到销毁期间都没有内存警告,那么这两个函数将始终不会被调用。
ios6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。
就算强制将viewController的view设为nil也不会触发。
如果viewController从创建到销毁期间都没有内存警告,那么这两个函数将始终不会被调用。
ios6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。
- (void)dealloc;
以上是关于整理ViewController的生命周期和加载过程的主要内容,如果未能解决你的问题,请参考以下文章
[ IOS ] 视图控制对象ViewController的生命周期