美文网首页
iOS 一张图看懂 initialize 和 load 的区别

iOS 一张图看懂 initialize 和 load 的区别

作者: iOS坚持者 | 来源:发表于2018-11-03 03:13 被阅读11次

    通过测试,load 会在程序启动 main 函数调用之前就会被执行,

    而initialize只有在第一次创建这个类的时候才会被执行

    源码如下:
    CCCC 继承于 AAAA

    AAAA.m

    
    @interface AAAAA: NSObject
    
    @end
    @implementation AAAAA
    -(void)dealloc{
        NSLog(@"%@对象执行 dealloc 方法",NSStringFromClass(self.class));
    }
    
    +(void)load
    {
        NSLog(@"%s---",__func__);
    }
    
    +(void)initialize{
        [super initialize];
        NSLog(@"%s---%@",__func__,NSStringFromClass(self.class));
    }
    
    @end
    
    

    CCCC.m

    
    @implementation CCCCC
    - (void)dealloc
    {
        NSLog(@"%@对象执行 dealloc 方法",NSStringFromClass(self.class));
    }
    //+(void)load
    //{
    //
    //    NSLog(@"%s---",__func__);
    //}
    //
    //+(void)initialize{
    //    [super initialize];
    //    NSLog(@"%s---",__func__);
    //}
    
    @end
    
    
    打印结果

    有上图可以得出一下结论:
    1、load 方法默认不会执行[super load]:通过注释 CCC 类的load方法,在程序启动的时候 AAAA 的load方法只执行了一次;而去掉注释 CCC 的 load 方法依然会执行,这就说明在程序加载CCCC 类执行到 load 函数的时候并没有去调用父类的 load 方法。注意不要再 load 中调用self,程序会去执行initialize方法。
    2、initialize 方法默认会[super initialize]:同理操作即可得出initialize会执行父类方法。
    3、initialize 方法只会被相同的类对象执行一次:有上图可得,在第一次创建 AAAA 对象的时候,initialize执行了一次,AAAA 对象 dealloc 了再去点击屏幕 new 一个新的对象,initialize不会去执行,说明initialize 方法只会被相同的类对象执行一次。CCCC 类去执行父类的initialize方法,当前的类对象依然是 子类CCCC 而不是 父类AAAA。

    load方法通常用来进行Method Swizzle,initialize方法一般用于初始化全局变量或静态变量。

    load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

    相关文章

      网友评论

          本文标题:iOS 一张图看懂 initialize 和 load 的区别

          本文链接:https://www.haomeiwen.com/subject/zlwhxqtx.html