OC消息机制

本质:发送消息而不是直接调用函数

在 Objective-C 中,[obj method] 本质是运行时消息发送。编译器会把它转成 objc_msgSend,再在运行时决定具体调用哪个实现。

方法查找流程(简化)

  1. 在对象的类方法缓存中查找。
  2. 缓存未命中时,在方法列表中查找。
  3. 当前类找不到,沿继承链向父类查找。
  4. 仍找不到,进入动态解析和消息转发流程。

动态特性来源

因为方法绑定发生在运行时,你可以实现:

  • 动态添加方法
  • 方法交换(swizzling)
  • 消息转发代理

这也是 OC 灵活但容易踩坑的根源。

消息转发三阶段

  1. resolveInstanceMethod: 动态补方法
  2. forwardingTargetForSelector: 指定备用接收者
  3. forwardInvocation: 完整转发

如果都不处理,最终抛出 unrecognized selector 崩溃。

性能与实践

常规业务代码不必担心 objc_msgSend 的性能,缓存命中后成本很低。更应该关注的是滥用动态特性造成的可维护性下降。

调试建议

  • 崩溃日志中先看 selector 名称。
  • 检查对象实际类型是否符合预期。
  • 避免在 category 中无约束覆盖系统方法。

总结

OC 消息机制的价值在于“运行时可塑性”。理解消息发送和转发链路后,很多看似神秘的崩溃都能快速定位。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""