load initialize

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方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 小时候,拥有一条小狗,我特别喜欢它,每天放学后第一件事就是看看它,怕它饿,赶紧从屋子里取出干粮一点点喂它。看它...
    生活涵如是阅读 476评论 0 1
  • 写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用...
    傲剑天涯阅读 2,922评论 1 5
  • 特殊的日子,还是想说说我们的情谊,我们的情谊,源自于偶然,我说是缘分,是上天安排的开始。一切好的姻缘的开始都是朴实...
    冰晶铃儿阅读 120评论 0 0
  • 微雨入衣无感觉,鼻涕长流才知添衣服!
    心中有你真好阅读 172评论 0 0