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
方法结构体
->名称
->参数
->实现