准备代码
@implementation LGPerson
+(void)load
{
NSLog(@"%s",__func__);
}
+ (void)initialize{
NSLog(@"%s",__func__);
}
@end
@implementation LGPerson (LG)
+(void)load
{
NSLog(@"%s",__func__);
}
+ (void)initialize{
NSLog(@"%s",__func__);
}
@end
@implementation LGPerson (KC)
+(void)load
{
NSLog(@"%s",__func__);
}
+ (void)initialize{
NSLog(@"%s",__func__);
}
@end
image.png
从上图分析出进入main函数,initialize并没有执行。
image.png从上图中分析出,点击下向下执行,initialize执行了。
image.png调用class方法initialize也执行了。initialize和调用某个方法没关系。
调用方法本质是objc_msgSend。objc_msgSend里面没有initialize方法。那就只有在lookUpImpOrForward方法里面。
initialize只调用某个类中的方法一次,和普通方法是一样的。
和Build Phases 中的Compiles Resouces类的编译循序有关系有关系。
initialize的调用流程。
lookUpImpOrForward中的方法
if (initialize && !cls->isInitialized()) {
cls = initializeAndLeaveLocked(cls, inst, runtimeLock);
// runtimeLock may have been dropped but is now locked again
// If sel == initialize, class_initialize will send +initialize and
// then the messenger will send +initialize again after this
// procedure finishes. Of course, if this is not being called
// from the messenger then it won't happen. 2778172
}
// Locking: caller must hold runtimeLock; this may drop and re-acquire it
static Class initializeAndLeaveLocked(Class cls, id obj, mutex_t& lock)
{
return initializeAndMaybeRelock(cls, obj, lock, true);
}
// runtimeLock is now unlocked, for +initialize dispatch
assert(nonmeta->isRealized());
initializeNonMetaClass(nonmeta);
#if __OBJC2__
@try
#endif
{
callInitialize(cls);
void callInitialize(Class cls)
{
((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize);
asm("");
}
从上可以分析出最终到objc_msgSend消息发送完毕。
网友评论