美文网首页
oc- +load和+initialize方法的区别

oc- +load和+initialize方法的区别

作者: 雨天多久就 | 来源:发表于2019-08-05 21:29 被阅读0次

    +(void)load+ (void)initialize都是NSObject的类方法。

    查看苹果的文档:

    +(void)load

    • 调用时机:当一个类或者分类被加入oc的runtime时候会被调用。
      app启动的时候,会加载所有的类,这个时候会调用所有类和分类的+(void)load方法(调用时机非常靠前,在main函数执行之前)。

    • 需要注意的是

      • 当一个类和它的子类以及分类都实现了+(void)load方法,这三个方法都会去调用。调用的顺序是:父类->子类->分类
      • 子类实现的时候,不需要显示的去调用父类的load方法。
      • 在load方法里可以去调用其他类的方法(虽然其他类的load方法可能还没有被调用)。

    + (void)initialize

    • 调用时机:在类第一次接收到消息的时候。
      runtime会在一个类或者其子类调用第一个方法的时候,给类发送+ (void)initialize消息。
    • 需要注意的是:
      • 父类会先收到消息。(子类调用方法前为了确保父类已经初始化,会先调用父类的)
      • 这个方法的调用是线程安全的。(源码中有锁的机制)
      • 如果父类实现这个方法,而子类没有实现这个方法,父类的方法可能会被调用很多次。(因为继承关系的原因,如果子类没有这个方法,就会去调用父类的这个方法)
      • 一个子类只会调用一次
      • 分类如果实现这个方法,会替换调父类的。
      • 尽量避免多个类在这个方法里互相调用方法,不然会形成死锁。

    相关文章

      网友评论

          本文标题:oc- +load和+initialize方法的区别

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