- +initialize方法会在类第一次接收到消息时调用
- +initialize是通过消息机制来调用的,所以分类中initialize会调用,而类的initialize就不会调用了
- +initialize会先调用父类的+initialize,再调用子类的+initialize方法。(分析源码得到)
- 如果子类没有实现+initialize,就会调用父类的+initialize(所以父类的+initialize可能会被调用多次)
通过消息机制,发送消息时。会去查找方法列表,在查找方法列表的过程中会调用
class_getInstanceMethod
方法,该方法中会调用lookUpImpOrNil
方法,在该方法中,会调用initializeAndLeaveLocked
,该方法中又调用initializeAndMaybeRelock
,该方法中调用initializeNonMetaClass
,该方法中会递归调用,并传入父类,然后调用callInitialize(cls)
,在callInitialize()
中会调用objc_msgSend(cls, @selector(initialize)
方法给对象发送消息
void initializeNonMetaClass(Class cls)
{
ASSERT(!cls->isMetaClass());
Class supercls;
bool reallyInitialize = NO;
// Make sure super is done initializing BEFORE beginning to initialize cls.
// See note about deadlock above.
// 如果父类没有初始化,就会先调用父类的初始化方法
supercls = cls->superclass;
if (supercls && !supercls->isInitialized()) {
initializeNonMetaClass(supercls);
}
...
callInitialize(cls);
void callInitialize(Class cls)
{
((void(*)(Class, SEL))objc_msgSend)(cls, @selector(initialize));
asm("");
}
网友评论