返回

用代码理解 ObjC 中的发送消息和消息转发

IOS

发送消息

发送消息是 Objective-C 中最基本的操作之一。当我们向一个对象发送一条消息时,对象可能会处理不了,结果就是程序发生crash。为了避免这种情况,Objective-C 引入了 NilTest 宏,该宏判断对象是否为 nil,若为 nil,直接返回 nil。

以下代码演示了如何实现 NilTest 宏:

#define NilTest(X) (X) ? (X) : [NSNull null]

在 ObjC 中,当一个对象无法处理一条消息时,会自动调用方法转发机制。方法转发分为两个步骤:

  1. 查找方法实现

  2. 执行方法实现

方法转发

在 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 运行时来动态地将消息转发到其他对象或方法。最后,我们总结了文章内容,并给出了进一步学习的资源。

进一步学习