OC消息发送和转发机制原理(OC消息传递与转发机制深度解析)
原创
一、引言
Objective-C (OC) 是一种面向对象的编程语言,其强盛的消息发送和转发机制是其核心特性之一。本文将深入解析OC中的消息发送与转发机制,帮助开发者更好地懂得和运用这一特性。
二、OC消息发送机制
OC中的消息发送机制首要涉及以下几个步骤:
2.1 消息发送的基本流程
当调用一个OC对象的方法时,实际上是在发送一个消息。以下是消息发送的基本流程:
id objc_msgSend(id self, SEL op, ...)
其中,self
指向接收消息的对象,op
是方法的 selector,后面的 ...
是方法的参数。
2.2 方法查找
当消息发送时,OC运行时会首先在接收消息的对象的类中查找对应的方法。查找过程如下:
- 首先在当前类的缓存中查找方法。
- 如果没有找到,则遍历当前类的父类,直到找到方法或到达根类。
- 如果找到了方法,则将其加入缓存,以便下次查找。
- 如果一直未找到方法,则会进入消息转发流程。
2.3 方法缓存
OC运行时为每个类维护了一个方法缓存,用于存储已经查找过的方法。当再次发送相同消息时,可以直接从缓存中获取方法,减成本时间查找高效能。
三、OC消息转发机制
当OC运行时在接收消息的对象及其父类中都没有找到对应的方法时,会启动消息转发机制。消息转发分为两步:动态方法解析和消息转发。
3.1 动态方法解析
动态方法解析允许开发者动态地为对象添加方法。OC运行时会调用以下两个方法,给开发者机会来动态添加方法:
+ (BOOL)resolveInstanceMethod:(SEL)sel
+ (BOOL)resolveClassMethod:(SEL)sel
如果这两个方法返回YES,并且圆满添加了方法,那么OC运行时会重新调用objc_msgSend
,尝试发送消息。
3.2 消息转发
如果动态方法解析没有圆满添加方法,那么OC运行时会进入消息转发流程。消息转发涉及以下三个方法:
- (void)forwardInvocation:(NSInvocation *)invocation
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
+ (id)forwardingTargetForSelector:(SEL)aSelector
以下是消息转发的具体流程:
- 调用
methodSignatureForSelector:
方法,获取消息的签名,用于创建NSInvocation
对象。 - 调用
forwardingTargetForSelector:
方法,查找另一个可以响应这个消息的对象。如果找到了,则将消息转发给这个对象。 - 如果没有找到合适的对象,则调用
forwardInvocation:
方法,将消息转发给其他对象或执行默认的处理。
四、示例分析
以下是一个简洁的示例,展示了怎样使用动态方法解析和消息转发:
@interface Person : NSObject
- (void)sayHello;
@end
@implementation Person
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(sayHello)) {
class_addMethod([self class], sel, (IMP)sayHelloImp, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
void sayHelloImp(id self, SEL _cmd) {
NSLog(@"Hello, world!");
}
- (void)forwardingTargetForSelector:(SEL)aSelector {
if (aSelector == @selector(sayGoodbye)) {
return [self class];
}
return [super forwardingTargetForSelector:aSelector];
}
@end
int main() {
Person *person = [[Person alloc] init];
[person performSelector:@selector(sayHello)];
[person performSelector:@selector(sayGoodbye)];
return 0;
}
在这个示例中,我们首先尝试动态解析sayHello
方法,然后通过forwardingTargetForSelector:
方法将sayGoodbye
消息转发给类对象。
五、总结
OC的消息发送和转发机制是OC编程语言的核心特性之一,它为开发者提供了灵活的方法处理未知的消息。懂得这一机制对于深入懂得OC编程和编写高效、健壮的代码至关重要。