• 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];
        }
    }
  • 相关阅读:
    树莓派配置Jdk环境并设置开机启动jar
    缓存架构之路(一)缓存概述及应用
    并发编程学习历程(零)JMM内存模型
    并发编程学习历程(一)Synchronized
    深入Disruptor源码分析(一)入门指南
    JAVA Synchronized和Lock实现原理
    Vscode断点调试PHP
    php环境搭建
    github使用总结
    面试笔记
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/4530454.html
Copyright © 2020-2023  润新知