【面试题】+initialize 相关
+ initialize
方法会在什么时候调用?
+ initialize
方法会在类第一次接收到消息时调用。
+ initialize
方法是否会被多次调用?
+ initialize
方法是通过 objc_msgSend
函数进行调用的,所以如果子类未实现 + initialize
方法,则父类会调用多次。
+ initialize
方法的调用顺序
先调用父类的 + initialize
方法,再调用子类的(先初始化父类,再初始化子类,每个类只会初始化一次)。如果分类实现了 + initialize
方法,则会覆盖类本身的 + initialize
方法。
objc4 源码分析
graph TB subgraph objc-runtime-new.mm A[class_getInstanceMethod] B[lookUpImpOrForward] C[realizeAndInitializeIfNeeded_locked] D[initializeAndLeaveLocked] E[initializeAndMaybeRelock] end subgraph objc-initialize.mm F[initializeNonMetaClass] G[callInitialize] H("((void(*)(Class, SEL))objc_msgSend)(cls, @selector(initialize));") end A-->B B-->C C-->D D-->E E-->F F-->G F-->|"supercls = cls->getSuperclass();<br>if (supercls && !supercls->isInitialized())"|F G-->H