返回
信息传递机制下 iOS 中 Objective-C 方法解析与消息转发的原理
IOS
2023-11-19 04:55:20
在 Objective-C 中,方法调用是通过向对象发送消息来完成的。消息包含了要调用的方法名称以及作为参数传递给方法的任何数据。当向对象发送消息时,Objective-C 运行时会搜索该对象的方法实现。此过程称为方法解析。
Objective-C 方法解析分为两个阶段:快速查找和慢速查找。快速查找在类的方法缓存(cache_t)中查找方法实现。如果方法实现未在缓存中找到,则执行慢速查找。慢速查找会遍历类的继承层次结构,搜索方法实现。
快速查找
快速查找是最常见的用于查找方法实现的方法。它比慢速查找快,因为无需遍历类的继承层次结构。但是,如果方法实现未在缓存中找到,则需要执行慢速查找。
慢速查找
慢速查找比快速查找慢,因为它需要遍历类的继承层次结构。然而,它能够找到快速查找可能找不到的方法实现。例如,如果方法实现是在父类中定义的,则快速查找可能找不到该方法实现。
消息转发
如果通过快速查找和慢速查找都找不到方法实现,则会发送消息给 -forwardInvocation:
方法。此方法允许对象动态处理它不理解的消息。-forwardInvocation:
方法可以将消息转发到另一个对象,或者它可以处理消息本身。
消息转发类型
有三种类型的消息转发:
- 正常转发: 消息转发到另一个对象。
- NSInvocation 转发: 消息封装在一个
NSInvocation
对象中并转发到另一个对象。 - 同步转发: 消息同步转发到另一个对象。
方法解析示例
以下示例演示了 Objective-C 中的方法解析:
// MyObject.h
@interface MyObject : NSObject
- (void)myMethod;
@end
// MyObject.m
@implementation MyObject
- (void)myMethod {
NSLog(@"Hello, world!");
}
@end
// main.m
int main() {
MyObject *myObject = [[MyObject alloc] init];
[myObject myMethod];
return 0;
}
当我们向 myObject
发送 myMethod
消息时,Objective-C 运行时会执行快速查找。快速查找将在 MyObject
类的缓存中查找 myMethod
方法实现。由于 myMethod
方法实现存在于 MyObject
类中,因此快速查找将成功。