NSObject是一切OC类的基类,所以我们必须对NSObject所有的方法有一个清楚的认识。
+ (void)load;
当类或者分类被加入到runtime时,load方法会被调用,也就是说在main循环开始前load方法就已经被调用。
(当类被加载到进程的address space时,runtime就会给每个类发送load消息。For classes that are in a shared (dynamically-loaded) library, the runtime sends the load message just after the shared library is loaded into the process's address space.)
由于我们不能确定类加载到runtime中的时间,所以我们要避免在load方法中调用其他oc类。
注意:
- 类的load方法,是在父类的load方法之后调用的
- 分类的load方法,是在类的load方法之后调用的
- 测试发现,只要类被加载到complie source中,即使没使用它,该类一样会被加载到runtime中
- 在load中创建的对象在main循环之前,它们并没被假如到AutoreleasePool中,需要自己手动来处理
+ (void)initialize;
当类,或者任何继承资它的类,在发送第一个消息之前,runtime会发送initialize消息给该类
- 父类先收到initialize消息,子类再收到
- 如果子类没有实现initialize方法,父类可能收到initialize消息(),可以使用下面的方法来阻止收到多次消息
1 + (void)initialize { 2 if (self == [ClassName self]) { 3 // ... do the initialization ... 4 } 5 }