美文网首页
load initialize

load initialize

作者: William_ | 来源:发表于2018-06-27 11:07 被阅读19次

    load:
    当类或者类别添加到objc的runtime中时调用,使用此方法执行类的特定行为。
    初始化的顺序为:
    1、链接到所有框架的初始化
    2、所有的+load方法
    3、所有的c++静态初始化函数和c/c++构造函数
    4、链接到你的框架中的所有初始化
    in addition:
    · 在所有的父类的+load方法调用完成之后调用类的+load方法
    · 分类的+load方法在类本身的+load方法之后调用。
    · Swift类桥接到Objective-C的加载方法的自定义实现不会自动调用。

    initialize:
    在收到第一条消息之前初始化该类
    runtime会在程序之前发送初始化给程序中的每个类,或者从该程序继承的任何类中发送它的第一条消息。 父类在它们的子类之前收到此消息。
    runtime以线程安全的方式将初始化消息发送给类。 也就是说,初始化由第一个线程运行以向类发送消息,并且任何尝试向该类发送消息的其他线程都将阻塞,直到初始化完成。
    如果子类不实现初始化 - runtime将调用继承的实现 - 或者子类显式调用[super initialize],则父类实现可能会被多次调用。 如果你想保护自己不被多次运行,你可以按照以下方式构建你的实现:

    + (void)initialize {
      if (self == [ClassName self]) {
        // ... do the initialization ...
      }
    }
    

    因为初始化是以阻塞的方式调用的,所以将方法实现限制到尽可能少的工作量是很重要的。 具体来说,任何其他类在其初始化方法中可能需要锁的代码都可能导致死锁。 因此,您不应该依赖于初始化来进行复杂的初始化,而应该将其限制为直接的类本地初始化。
    每个类只能调用一次initialize。 如果你想对类和类的类别进行独立的初始化,你应该实现load方法。

    相关文章

      网友评论

          本文标题:load initialize

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