- +initialize方法會(huì)在類第一次接收到消息時(shí)調(diào)用
- +initialize是通過(guò)消息機(jī)制來(lái)調(diào)用的,所以分類中initialize會(huì)調(diào)用,而類的initialize就不會(huì)調(diào)用了
- +initialize會(huì)先調(diào)用父類的+initialize云挟,再調(diào)用子類的+initialize方法法绵。(分析源碼得到)
- 如果子類沒(méi)有實(shí)現(xiàn)+initialize,就會(huì)調(diào)用父類的+initialize(所以父類的+initialize可能會(huì)被調(diào)用多次)
通過(guò)消息機(jī)制涧狮,發(fā)送消息時(shí)炕矮。會(huì)去查找方法列表,在查找方法列表的過(guò)程中會(huì)調(diào)用
class_getInstanceMethod
方法者冤,該方法中會(huì)調(diào)用lookUpImpOrNil
方法肤视,在該方法中,會(huì)調(diào)用initializeAndLeaveLocked
,該方法中又調(diào)用initializeAndMaybeRelock
涉枫,該方法中調(diào)用initializeNonMetaClass
,該方法中會(huì)遞歸調(diào)用邢滑,并傳入父類,然后調(diào)用callInitialize(cls)
,在callInitialize()
中會(huì)調(diào)用objc_msgSend(cls, @selector(initialize)
方法給對(duì)象發(fā)送消息
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.
// 如果父類沒(méi)有初始化,就會(huì)先調(diào)用父類的初始化方法
supercls = cls->superclass;
if (supercls && !supercls->isInitialized()) {
initializeNonMetaClass(supercls);
}
...
callInitialize(cls);
void callInitialize(Class cls)
{
((void(*)(Class, SEL))objc_msgSend)(cls, @selector(initialize));
asm("");
}