消息转发全流程

从慢速查找确认找不到 IMP 开始,libobjc 只负责交棒,CoreFoundation 的 ___forwarding___ 负责调度三部曲,开发者在三个回调点决定消息是被接住、改道,还是最终崩溃。

libobjc 边界 CF 调度 开发者可覆写 签名探测 失败出口
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 方法,黄色是完整转发里的签名探测支线。