返回

OC底层原理08:消息流程之动态方法决议 & 消息转发

IOS

前面文章分析了,在objc_msgSend的快速查找和慢速查找中,分别分析了objc_msgSend的快速查找和慢速查找,在这两种都没找到方法实现的情况下,苹果给了两个建议:

  • 重新检查类的实现。有时候,类可以有多个实现文件,代码中只包含了其中一个实现文件,导致无法找到方法的实现。
  • 将方法声明添加到类的头文件和所有实现文件中。尽管这可能会导致某些编译警告或错误,但它可以确保方法在类的所有实现中都可用。

如果以上两种方法都不起作用,可以使用动态方法决议。动态方法决议是一种机制,允许在运行时确定方法的实现。

动态方法决议

动态方法决议有两种方式:

  • 消息转发 :消息转发允许将消息转发到另一个对象。
  • 方法决议 :方法决议允许在运行时确定方法的实现。

消息转发

消息转发是动态方法决议的一种机制,它允许将消息转发到另一个对象。这可以通过两种方式来完成:

  • 方法转发 :方法转发允许将消息转发到另一个类的实例。
  • 属性转发 :属性转发允许将属性访问转发到另一个类的实例。

方法转发

方法转发是消息转发的一种形式,它允许将消息转发到另一个类的实例。方法转发通过以下步骤完成:

  1. 接收者对象收到消息。
  2. 接收者对象检查其类是否实现了该消息。
  3. 如果类没有实现该消息,接收者对象将消息转发给它的父类。
  4. 父类检查它是否实现了该消息。
  5. 如果父类也没有实现该消息,父类将消息转发给它的父类。
  6. 这个过程一直持续到找到一个实现了该消息的类为止。
  7. 实现该消息的类执行该消息。

属性转发

属性转发是消息转发的一种形式,它允许将属性访问转发到另一个类的实例。属性转发通过以下步骤完成:

  1. 接收者对象收到一个属性访问消息。
  2. 接收者对象检查其类是否实现了该属性。
  3. 如果类没有实现该属性,接收者对象将属性访问消息转发给它的父类。
  4. 父类检查它是否实现了该属性。
  5. 如果父类也没有实现该属性,父类将属性访问消息转发给它的父类。
  6. 这个过程一直持续到找到一个实现了该属性的类为止。
  7. 实现该属性的类执行该属性访问。

方法决议

方法决议是动态方法决议的另一种机制,它允许在运行时确定方法的实现。方法决议通过以下步骤完成:

  1. 接收者对象收到消息。
  2. 接收者对象检查其类是否实现了该消息。
  3. 如果类没有实现该消息,接收者对象将消息发送给它的类。
  4. 类检查它是否实现了该消息。
  5. 如果类也没有实现该消息,类将消息发送给它的父类。
  6. 这个过程一直持续到找到一个实现了该消息的类为止。
  7. 实现该消息的类执行该消息。

总结

动态方法决议是一种机制,允许在运行时确定方法的实现。动态方法决议有两种方式:消息转发和方法决议。消息转发允许将消息转发到另一个对象,而方法决议允许在运行时确定方法的实现。