zoukankan      html  css  js  c++  java
  • Objetive-C initialize研究

    • initialize执行时机
              在向一个类执行实例方法或者类方法(除了initialize和load方法之外)的时候,触发initialize方法,因此如果一个类你没有使用的时候,是不会执行的。
     
    • initialize的执行顺序和次数
              initialize的执行顺序和普通方法一样遵从方法转发的规律,因此一个子类没有重载initialize方法时,将会调用父类的initialize方法。
              在扩展中重载这个方法中时,会覆盖掉原有类中得initialize方法,多个扩展覆盖initialize方法,将导致不确定的结果。
              initialize子类只会执行一次,对于父类来说,可能会来自子类的调用,可能执行多次
     
              下面是一个demo,说明一个initialize的执行规律
              
    @interface initTest : NSObject
    @end

    @interface sub1 : initTest
    @end

    @interface sub2 : sub1
    @property (nonatomic, strong) NSString *kvoTestStr;
    @end

    @interface sub2 (category1)
    @end

    @interface sub2 (category2)
    @end
     
    @implementation initTest

    //+(void)initialize
    //{
    //    NSLog(@"%s|%@  ",__func__ ,[self class]);
    //}

    +(void)load
    {
        NSLog(@"%s  ",__func__ );
    }

    @end


    @implementation sub1

    +(void)initialize
    {
        NSLog(@"%s|%@  ",__func__ ,[self class]);
    }

    //+(void)load
    //{
    //    NSLog(@"%s  ",__func__ );
    //}
    @end


    @implementation sub2

    //+(void)initialize
    //{
    //    NSLog(@"%s|%@  ",__func__ ,[self class]);
    //}

    +(void)load
    {
        NSLog(@"%s  ",__func__ );
    }

    @end


    @implementation sub2 (category1)

    //+(void)initialize
    //{
    //    NSLog(@"%s|%@  ",__func__ ,[self class]);
    //}


    +(void)load
    {
        NSLog(@"%s  ",__func__ );
    }

    @end

    @implementation sub2 (category2)

    //+(void)initialize
    //{
    //    NSLog(@"%s|%@  ",__func__ ,[self class]);
    //}

    +(void)load
    {
        NSLog(@"%s  ",__func__ );
    }
    @end
         执行结果
     
     
    2015-05-26 13:44:58.757 OCinitTest[80219:72734510] +[initTest load] 
    2015-05-26 13:44:58.758 OCinitTest[80219:72734510] +[sub2 load] 
    2015-05-26 13:44:58.759 OCinitTest[80219:72734510] +[sub2(category1) load] 
    2015-05-26 13:44:58.759 OCinitTest[80219:72734510] +[sub2(category2) load] 
    2015-05-26 13:44:58.863 OCinitTest[80219:72734510] +[sub1 initialize]|sub1 
    2015-05-26 13:44:58.863 OCinitTest[80219:72734510] +[sub1 initialize]|sub2 
    2015-05-26 13:44:58.863 OCinitTest[80219:72734510] +[sub1 initialize]|NSKVONotifying_sub2  
     
    •  initialize的作用
               在initialize中可以初始化一个单例。
     

      

    static MySingleton *sharedSingleton;
    
    + (void)initialize
    {
        static BOOL initialized = NO;
        if(!initialized)
        {
            initialized = YES;
            sharedSingleton = [[MySingleton alloc] init];
        }
    }
  • 相关阅读:
    玩转oracle学习第五天
    硅谷科技巨头最刁钻面试题集锦
    Python模拟登录wap版百度贴吧+自己主动回贴
    Flask 源代码阅读笔记
    Spark1.0.0 生态圈一览
    listView.getChildAt(i)时java.lang.NullPointerException
    选择排序
    JNI 系统钩子
    MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写
    VVDocumenter
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/4530454.html
Copyright © 2011-2022 走看看