返回
用代码理解 ObjC 中的发送消息和消息转发
IOS
2023-09-18 02:36:22
发送消息
发送消息是 Objective-C 中最基本的操作之一。当我们向一个对象发送一条消息时,对象可能会处理不了,结果就是程序发生crash。为了避免这种情况,Objective-C 引入了 NilTest 宏,该宏判断对象是否为 nil,若为 nil,直接返回 nil。
以下代码演示了如何实现 NilTest 宏:
#define NilTest(X) (X) ? (X) : [NSNull null]
在 ObjC 中,当一个对象无法处理一条消息时,会自动调用方法转发机制。方法转发分为两个步骤:
-
查找方法实现
-
执行方法实现
方法转发
在 Objective-C 中,消息转发机制可以通过两个宏来实现:
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
forwardInvocation: 方法用于执行方法实现,methodSignatureForSelector: 方法用于查找方法实现。
代码实现
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
if (!signature) {
signature = [self.cacheLookup methodSignatureForSelector:aSelector];
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL selector = [anInvocation selector];
IMP imp = [self.cacheLookup methodForSelector:selector];
if (imp) {
[anInvocation invokeWithTarget:self];
} else {
[super forwardInvocation:anInvocation];
}
}
总结
本文介绍了如何在 Objective-C 中实现发送消息和消息转发。我们从发送消息开始,通过实现一个简单的发送消息函数,介绍了如何从一个对象向另一个对象发送消息。然后,我们探讨了消息转发,展示了如何使用 Objective-C 运行时来动态地将消息转发到其他对象或方法。最后,我们总结了文章内容,并给出了进一步学习的资源。
进一步学习