13.动态决议与消息转发
前言
IMP lookUpImpOrForward(id inst, SEL sel, Class cls, int behavior)
{
const IMP forward_imp = (IMP)_objc_msgForward_impcache;
IMP imp = nil;
Class curClass;
...
for (unsigned attempts = unreasonableClassCount();;) {
if (curClass->cache.isConstantOptimizedCache(/* strict */true)) {
...
} else {
...
if (slowpath((curClass = curClass->getSuperclass()) == nil)) {
// No implementation found, and method resolver didn't help.
// Use forwarding.
imp = forward_imp;
break;
}
}
...
}
// No implementation found. Try method resolver once.
if (slowpath(behavior & LOOKUP_RESOLVER)) {
behavior ^= LOOKUP_RESOLVER;
return resolveMethod_locked(inst, sel, cls, behavior);
}
...
done_unlock:
runtimeLock.unlock();
if (slowpath((behavior & LOOKUP_NIL) && imp == forward_imp)) {
return nil;
}
return imp;
}先附上一张流程图

一、 _objc_msgForward_impcache
二、 resolveMethod_locked
三、实例方法动态决议
3.1 动态添加Method
3.2 如果再次调用,还会不会进行动态决议呢?
3.3 源码解析
四、类方法动态决议
4.1 动态添加Method
4.2 类方法动态决议的特殊处理
五、消息转发
5.1 寻找切入点

5.2 汇编分析 CoreFoundation`forwarding:
5.3 转发对象为空的情况
六、总结
Last updated