返回

一文领略OC运行时消息转发机制的细节

IOS

前言

在上篇 OC 原理探索:动态方法决议 中,我们对动态方法决议进行了探索。然而,如果动态方法决议仍然无法处理消息,Objective-C 运行时还会执行哪些操作呢?今天,我们将继续探索动态方法决议之后的消息转发流程。

准备工作

  • objc4-818.2 源码
  • CF

消息转发流程

  1. 动态方法决议

    动态方法决议是消息转发流程的第一步。在这一步中,Objective-C 运行时会尝试通过各种机制查找并调用与消息选择器相对应的实现方法。如果动态方法决议成功,则消息将被直接转发给实现方法执行。

  2. performSelector

    如果动态方法决议失败,Objective-C 运行时会调用 performSelector 方法来继续消息转发过程。performSelector 方法会根据消息选择器来查找并调用与之相对应的实现方法。如果 performSelector 方法能够找到实现方法,则消息将被直接转发给实现方法执行。

  3. NSMethodSignature

    如果 performSelector 方法也无法找到实现方法,Objective-C 运行时会使用 NSMethodSignature 对象来检查消息选择器是否有效。NSMethodSignature 对象包含了消息选择器对应的实现方法的签名信息。如果 NSMethodSignature 对象存在,则说明消息选择器是有效的,Objective-C 运行时会继续消息转发过程。

  4. NSInvocation

    如果 NSMethodSignature 对象存在,Objective-C 运行时会创建一个 NSInvocation 对象。NSInvocation 对象包含了消息选择器、目标对象、参数列表以及实现方法的签名信息。NSInvocation 对象可以被用来调用实现方法。

  5. forwardInvocation

    如果 NSInvocation 对象创建成功,Objective-C 运行时会调用 forwardInvocation 方法来完成消息转发过程。forwardInvocation 方法会将消息选择器、目标对象、参数列表以及实现方法的签名信息传递给实现方法,从而完成消息的调用。

结论

消息转发机制是 Objective-C 运行时的一个重要组成部分,它允许在运行时动态地调用方法。消息转发机制的流程包括动态方法决议、performSelector、NSMethodSignature、NSInvocation 和 forwardInvocation 等步骤。通过理解消息转发机制的细节,我们可以更好地理解 Objective-C 语言的底层实现原理。