OC消息机制
本质:发送消息而不是直接调用函数
在 Objective-C 中,[obj method] 本质是运行时消息发送。编译器会把它转成 objc_msgSend,再在运行时决定具体调用哪个实现。
方法查找流程(简化)
- 在对象的类方法缓存中查找。
- 缓存未命中时,在方法列表中查找。
- 当前类找不到,沿继承链向父类查找。
- 仍找不到,进入动态解析和消息转发流程。
动态特性来源
因为方法绑定发生在运行时,你可以实现:
- 动态添加方法
- 方法交换(swizzling)
- 消息转发代理
这也是 OC 灵活但容易踩坑的根源。
消息转发三阶段
resolveInstanceMethod:动态补方法forwardingTargetForSelector:指定备用接收者forwardInvocation:完整转发
如果都不处理,最终抛出 unrecognized selector 崩溃。
性能与实践
常规业务代码不必担心 objc_msgSend 的性能,缓存命中后成本很低。更应该关注的是滥用动态特性造成的可维护性下降。
调试建议
- 崩溃日志中先看 selector 名称。
- 检查对象实际类型是否符合预期。
- 避免在 category 中无约束覆盖系统方法。
总结
OC 消息机制的价值在于“运行时可塑性”。理解消息发送和转发链路后,很多看似神秘的崩溃都能快速定位。