• iOS视图控制对象生命周期


    iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途

    init-初始化程序

    viewDidLoad-加载视图

    viewWillAppear-UIViewController对象的视图即将加入窗口时调用;

    viewDidApper-UIViewController对象的视图已经加入到窗口时调用;

    viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;

    viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;

    viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;

    viewDidUnload-当内存过低,释放一些不需要的视图时调用。

      

            视图控制对象通过alloc和init来创建,但是视图控制对象不会在创建的那一刻就马上创建相应的视图,而是等到需要使用的时候才通过调用loadView来创建,这样的做法能提高内存的使用率。比如,当某个标签有很多UIViewController对象,那么对于任何一个UIViewController对象的视图,只有相应的标签被选中时才会被创建出来。

    比如如下代码:

     1 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
     2 {
     3     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     4     if (self) {
     5         // Custom initialization
     6         UITabBarItem *tbi = [self tabBarItem];
     7         [tbi setTitle:@"CurrentTime"];
     8         [[self view ] setBackgroundColor:[UIColor yellowColor]];
     9         }
    10     return self;
    11 }

    我们将UIViewController的init方法中访问的实例变量view在init中将背景设置为黄色,运行程序,我们能发现背景的确变成了黄色,但是,在我们还没有需要使用视图的时候,该视图已经加载好了,在UIViewController的初始方法中访问实例变量view,会导致延迟载入机制失效,这个问题看上去不是很严重,但是如果考虑到内存过低警告,那么问题就大了。。。

      

    运行程序,选择模拟器中的硬件->模拟内存过低警告,我们会发现,原本设置的黄色背景不见了,这是因为,内存过低,视图控制对象会在发出内存过低警告时收到didReceiveMemoryWarning消息,该方法默认实现,检查视图控制对象的视图是否可见,如果不可见,则释放掉,下次在加载该视图时就不会执行init方法,而是只执行viewDidLoad方法,所以需要将[[selfview ] setBackgroundColor:[UIColoryellowColor]];放到viewDidLoad中,这样如果视图因为内存过低被释放掉了,下次需要使用到该视图的时候,程序会默认取执行该视图的viewDidLoad方法,这样背景颜色就又出来了。

    init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的执行顺序:

     从程序的log来看:

    2012-10-19 15:51:44.811inHyron[483:b903] init

    2012-10-19 15:51:54.081inHyron[483:b903] viewDidLoad

    2012-10-19 15:51:54.082inHyron[483:b903] viewVillAppear

    2012-10-19 15:51:54.084 inHyron[483:b903] viewDidAppear

    很明显,先执行init、然后执行viewDidLoad,然后是viewWillAppear最后是viewDidAppear,这样视图就创建好了,当视图消失或者被覆盖的时候:

    2012-10-19 15:54:14.557inHyron[483:b903] viewWillDisappear

    2012-10-19 15:54:14.558inHyron[483:b903] viewDidDisappear

    这样一来视图就消失了,当模拟内存警告的时候:

    2012-10-19 15:55:14.333inHyron[483:b903] Received simulated memory warning.

    2012-10-19 15:55:14.334inHyron[483:b903] viewWillUnload

    2012-10-19 15:55:14.335 inHyron[483:b903]viewDidUnload

    从log可以看出,当视图控制对象收到内存警告的时候,程序会执行viewWillUnload最后是执行viewDidUnload。

    这样,一套的流程就完成了。

    转自(感谢):http://blog.csdn.net/weasleyqi/article/details/8090373

  • 相关阅读:
    jquery 序列化form表单
    nginx for windows 安装
    nodejs idea 创建项目 (一)
    spring 配置 shiro rememberMe
    idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法
    redis 在windows 集群
    spring IOC控制反转和DI依赖注入
    redis 的安装
    shiro 通过jdbc连接数据库
    handlebars的用法
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/4662512.html
Copyright © 2020-2023  润新知