zoukankan      html  css  js  c++  java
  • 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被废弃了

  • 相关阅读:
    深入理解Linux中内存管理
    谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用
    IIS是如何处理ASP.NET请求的
    如何用美剧真正提升你的英语水平
    软件开发启示录——迟到的领悟
    程序员最头疼的事:命名
    iOS开发教程之:iPhone开发环境搭建
    去除Html标签
    Nagios Looking Glass 本地文件包含漏洞
    win32多线程程序设计
  • 原文地址:https://www.cnblogs.com/ycg0808/p/5499433.html
Copyright © 2011-2022 走看看