+(void)load
和+ (void)initialize
都是NSObject的类方法。
查看苹果的文档:
+(void)load
调用时机:当一个类或者分类被加入oc的runtime时候会被调用。
app启动的时候,会加载所有的类,这个时候会调用所有类和分类的+(void)load
方法(调用时机非常靠前,在main函数执行之前)。-
需要注意的是
- 当一个类和它的子类以及分类都实现了+(void)load方法,这三个方法都会去调用。调用的顺序是:父类->子类->分类
- 子类实现的时候,不需要显示的去调用父类的load方法。
- 在load方法里可以去调用其他类的方法(虽然其他类的load方法可能还没有被调用)。
+ (void)initialize
-
调用时机:在类第一次接收到消息的时候。
runtime会在一个类或者其子类调用第一个方法的时候,给类发送+ (void)initialize
消息。 -
需要注意的是:
- 父类会先收到消息。(子类调用方法前为了确保父类已经初始化,会先调用父类的)
- 这个方法的调用是线程安全的。(源码中有锁的机制)
- 如果父类实现这个方法,而子类没有实现这个方法,父类的方法可能会被调用很多次。(因为继承关系的原因,如果子类没有这个方法,就会去调用父类的这个方法)
- 一个子类只会调用一次
- 分类如果实现这个方法,会替换调父类的。
- 尽量避免多个类在这个方法里互相调用方法,不然会形成死锁。