1. libobjc 找不到方法
↓ 返回占位 IMP
↓
2. CoreFoundation 接管
↓
↓ 先问能不能换 receiver
3. 开发者机会与签名探测
如果返回值既不是 nil 也不是 self:重新进入 objc_msgSend,消息被转给新对象。
nil / self ↓
默认签名探测可能触发 ↓
signature != nil ↓
4. 收敛结果
signature == nil 或无人处理 ↓
objc4 里的实现会 _objc_fatal。
带 CF 时通常命中 CF 版本,抛 NSInvalidArgumentException。
lookUpImpOrForward
libobjc
当前类、父类链和动态方法解析都没有提供实现时,慢速查找会返回转发占位 IMP。注意这不是“找到方法”,而是把消息送往转发系统的标记。
对应正文:第 10 节之后进入第三部分。
关键判断:resolver 也失败,LOOKUP_RESOLVER 已关闭。
下一步:返回 _objc_msgForward_impcache。
读图顺序:先看四条泳道,再点击节点看细节。绿色是 libobjc 的边界工作,粉色是 CoreFoundation 的闭源调度,蓝色是业务代码可以覆写的 Objective-C 方法,黄色是完整转发里的签名探测支线。