2018-09-10 方法调用流程

2018-09-10  本文已影响0人  OneStepAway

objc.h


屏幕快照 2018-09-10 上午11.26.24.png

runtime.h


类内部实现

// 查找IMP
IMP class_getMethodImplementation(Class cls, SEL sel) {
if (!cls || !sel) return nil;
IMP imp = lookUpImpOrNil(cls, sel);
if (!imp) {
... // 执行动态绑定
}
IMP imp = lookUpImpOrNil(cls, sel);
if (!imp) return _objc_msgForward; // 这个是用于消息转发的
return imp;
}

(实例方法)调用方法时 在ceche(objc_cache)中查找->methodLists ->是否有动态绑定(resolveInstanceMethod) ->父类的 methodLists -> 消息转发
(类方法)和实例相似 不同的是从元类(metaClass)(Class _Nonnull isa OBJC_ISA_AVAILABILITY)中查找.

runtime.h


方法结构体

->名称
->参数
->实现

上一篇下一篇

猜你喜欢

热点阅读