lookUpImpOrForward 执行流程
objc-runtime-new.mm · 慢速查找路径
Phase 1 · 安全校验与准备
Phase 2 · 继承链递归查找
Phase 3 · 动态方法解析
Phase 4 · 缓存回填与返回
objc_msgSend 快速路径 Miss
类是否已初始化?
是
否
设 NOCACHE
runtimeLock.lock() · checkIsKnownClass
cls 是否有效?
无效/nil
returnNil
有效
↓ 继承链循环(attempts 计数器保护)
本类方法表二分查找 getMethodNoSuper
命中
→ done
未命中
父类是否存在?(getSuperclass)
nil (到顶)
forward_imp
存在
查父类缓存 cache_getImp(curClass)
命中真实 IMP
→ done
命中 forward_imp
break
未命中
attempts-- == 0?(继承链成环?)
是
_objc_fatal
继续向上
LOOKUP_RESOLVER 允许?
resolveInstanceMethod / resolveClassMethod
是
重新查找
否(forward_imp)
done: log_and_fill_cache
LOOKUP_NOCACHE 未设置时回填缓存
runtimeLock.unlock()
return IMP
图例
命中/成功
失败/转发
特殊路径
主流程