美文网首页
浅谈OC类方法load和initialize系列二

浅谈OC类方法load和initialize系列二

作者: 天蓬大元 | 来源:发表于2017-10-17 18:21 被阅读0次

    +(void)load与+(void)initialize初探

    针对的概念

    1,IOS会在运行期提前并且自动调用这两个方法。
    2,load和initialize的区别在于:load是只要类所在文件被引用,就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。

    示例代码一
    @interface SuperClass:NSObject
    @end
    @implementation SuperClass
    +(void)initialize{
        NSLog(@"%@ %s",[self class], __FUNCTION__);
    }
    +(void)load{
        NSLog(@"%@ %s",[self class], __FUNCTION__);
    }
    @end
    
    示例代码二
    @interface Insideinitialize:NSObject
    @end
    @implementation Insideinitialize
    +(void)initialize{
        NSLog(@"%@ %s",[self class], __FUNCTION__);
    }
    +(void)load{
        NSLog(@"%s", __FUNCTION__);
    }
    @end
    

    示例代码一中:

    SuperClass重写了load和initialize方法,并分别在两个方法中调用Class类方法打印当前类的名字以及打印当前运行的方法名字

    示例代码二中:

    Insideinitialize重写的load方法中,去除了对Class方法的调用。

    现在我们在Xcode的项目中只简单的import这两个类,而不去使用它们。然后运行项目,获得下面的结果:

    //示例代码一
    SuperClass +[SuperClass initialize]
    SuperClass +[SuperClass load]
    //示例代码二
    +[Insideinitialize load]
    
    根据打印结果,可以看出:

    示例代码一中:SuperClass的load方法和initialize都有被调用。因为SuperClass所在文件被工程引用,所以运行期会提前并自动调用它的load方法。同时,由于load方法中调用了[self class]类方法,也就是此时SuperClass的第一个方法被调用,则在调用该类方法之前,运行期会自动调用initialize方法。所以,两个方法都被运行期提前并自动运行,同时,initialize方法先于load方法执行。
    示例代码二中:initialize方法没有被调用也就是情理之中了。

    彩蛋:Runtime对类的load方法调用并不视为类的第一个方法调用。

    资料链接:

    [IDER]:
    http://blog.iderzheng.com
    http://blog.iderzheng.com/objective-c-load-vs-initialize/
    [MrPeak杂货铺]:http://blog.csdn.net/hanangellove/article/details/45033453
    [知乎上的一个怎么面试iOS工程师的问题]:
    http://blog.csdn.net/hanangellove/article/details/45033453

    相关文章

      网友评论

          本文标题:浅谈OC类方法load和initialize系列二

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