返回
OC底层原理08:消息流程之动态方法决议 & 消息转发
IOS
2024-01-10 01:35:25
前面文章分析了,在objc_msgSend的快速查找和慢速查找中,分别分析了objc_msgSend的快速查找和慢速查找,在这两种都没找到方法实现的情况下,苹果给了两个建议:
- 重新检查类的实现。有时候,类可以有多个实现文件,代码中只包含了其中一个实现文件,导致无法找到方法的实现。
- 将方法声明添加到类的头文件和所有实现文件中。尽管这可能会导致某些编译警告或错误,但它可以确保方法在类的所有实现中都可用。
如果以上两种方法都不起作用,可以使用动态方法决议。动态方法决议是一种机制,允许在运行时确定方法的实现。
动态方法决议
动态方法决议有两种方式:
- 消息转发 :消息转发允许将消息转发到另一个对象。
- 方法决议 :方法决议允许在运行时确定方法的实现。
消息转发
消息转发是动态方法决议的一种机制,它允许将消息转发到另一个对象。这可以通过两种方式来完成:
- 方法转发 :方法转发允许将消息转发到另一个类的实例。
- 属性转发 :属性转发允许将属性访问转发到另一个类的实例。
方法转发
方法转发是消息转发的一种形式,它允许将消息转发到另一个类的实例。方法转发通过以下步骤完成:
- 接收者对象收到消息。
- 接收者对象检查其类是否实现了该消息。
- 如果类没有实现该消息,接收者对象将消息转发给它的父类。
- 父类检查它是否实现了该消息。
- 如果父类也没有实现该消息,父类将消息转发给它的父类。
- 这个过程一直持续到找到一个实现了该消息的类为止。
- 实现该消息的类执行该消息。
属性转发
属性转发是消息转发的一种形式,它允许将属性访问转发到另一个类的实例。属性转发通过以下步骤完成:
- 接收者对象收到一个属性访问消息。
- 接收者对象检查其类是否实现了该属性。
- 如果类没有实现该属性,接收者对象将属性访问消息转发给它的父类。
- 父类检查它是否实现了该属性。
- 如果父类也没有实现该属性,父类将属性访问消息转发给它的父类。
- 这个过程一直持续到找到一个实现了该属性的类为止。
- 实现该属性的类执行该属性访问。
方法决议
方法决议是动态方法决议的另一种机制,它允许在运行时确定方法的实现。方法决议通过以下步骤完成:
- 接收者对象收到消息。
- 接收者对象检查其类是否实现了该消息。
- 如果类没有实现该消息,接收者对象将消息发送给它的类。
- 类检查它是否实现了该消息。
- 如果类也没有实现该消息,类将消息发送给它的父类。
- 这个过程一直持续到找到一个实现了该消息的类为止。
- 实现该消息的类执行该消息。
总结
动态方法决议是一种机制,允许在运行时确定方法的实现。动态方法决议有两种方式:消息转发和方法决议。消息转发允许将消息转发到另一个对象,而方法决议允许在运行时确定方法的实现。