viewController的生命周期

ViewController是iOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调。在IOS中,有两类ViewController,一类是显示内容的,比如UIViewController、UITableViewController等,同时还可以自定义继承自UIViewController的ViewController;另一类是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewController,UITabBarController是以Array的形式来管理ViewController。和Android中Activity一样,IOS开发中,ViewController也有自己的生命周期(Lifecycle)。

 

iOS6.0以后的viewController的生命周期图

 

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

1. + (id)alloc 分配内存;

2. - (id)init 方法(包括其他-(id)init...方法),只允许调用一次,并且要与 alloc方法 写在一起,在init方法中申请的内存,要在dealloc方法中释放(或者其他地方);

3. - (void)awakeFromNib 使用Xib初始化后会调用此方法,一般不会重写此方法;

4. - (void)loadView 如果使用Xib创建ViewController,就不要重写该方法。一般不会修改此方法;

关于loadView方法的重写,官方文档中有一个明显的注释,原文如下:

Note: When overriding the loadView method to create your views programmatically, you should not call super. Doing so initiates the default view-loading behavior and usually just wastes CPU cycles. Your own implementation of the loadView method should do all the work that is needed to create a root view and subviews for your view controller.

意思是当通过代码方式去创建你自己的view时,在loadView方法中不应该调用super,如果调用[super loadView]会影响CPU性能

 

5. - (void)viewDidLoad 视图加载完成之后被调用,这个方法很重要,可以在此增加一些自己定义的控件,注意此时view的frame不一定是显示时候的frame,真实的frame会在 - (void)viewDidAppear: 后。

在iOS6.0+版本中在对象的整个生命周期中只会被调用一次

6. - (void)viewWillAppear:(BOOL)animated view 将要显示的时候,可以在此加载一些图片,刷新数据,和一些其他占内存的资源;

7. - (void)viewDidAppear:(BOOL)animated view 已经显示的时候;

 

8. - (void)viewWillDisappear:(BOOL)animated view 将要隐藏的时候,可以在此将一些占用内存比较大的资源先释放掉,在 viewWillAppear: 中重新加载。如:图片/声音/视频。如果View已经隐藏而又在内存中保留这些在显示前不会被调用的资源,那么App闪退的几率会增加,尤其是ViewController比较多的时候;

9. - (void)viewDidAppear:(BOOL)animated view 已经隐藏的时候;

10. - (void)dealloc,不要手动调用此方法,当引用计数值为0的时候,系统会自动调用此方法。

二、使用 NavigationController 去 Push 切换显示的View的时候,调用的顺序:

例如 从 A 控制器 Push 显示 B 控制器,

[(A *)self.navigationController pushViewController:B animated:YES]

1. 加载B控制器的View(如果没有的话);

2. 调用 A 的 - (void)viewWillDisappear:(BOOL)animated;

3. 调用 B 的 - (void)viewWillAppear:(BOOL)animated;

4. 调用 A 的 - (void)viewDidDisappear:(BOOL)animated;

5. 调用 B 的 - (void)viewDidAppear:(BOOL)animated;

总结来说,ViewController 的切换是先调用 隐藏的方法,再调用显示的方法;先调用Will,再调用Did

 

 

iOS6.0之前的viewcontroller的生命周期图

 

 

 

 

 

viewWillUnloadviewDidUnload已经在ios6被废弃了

posted on 2016-05-16 20:47  杨春歌  阅读(384)  评论(1编辑  收藏  举报

导航