返回
用代码理解ObjC中的发送消息和消息转发
IOS
2023-11-27 05:47:56
消息发送
在Objective-C中,对象之间的通信是通过发送消息来实现的。当向一个对象发送消息时,编译器会将消息转换成一个函数调用,这个函数就是该消息对应的实现方法。
消息转发
如果一个对象收到了它无法处理的消息,它可以将消息转发给另一个对象。这个过程称为消息转发。消息转发有两种方式:
- 方法决议(Method Resolution): 当一个对象收到它无法处理的消息时,它会首先尝试通过方法决议来找到一个可以处理该消息的方法。如果方法决议成功,则会将消息转发给找到的方法;如果方法决议失败,则会引发一个异常。
- 消息转发(Message Forwarding): 如果一个对象无法通过方法决议找到一个可以处理该消息的方法,它会将消息转发给它的父类。这个过程称为消息转发。消息转发可以一直持续到找到一个可以处理该消息的方法,或者直到达到根类(NSObject)。
代码示例
以下代码演示了如何在Objective-C中发送消息和转发消息:
@interface MyClass : NSObject
- (void)sayHello;
@end
@implementation MyClass
- (void)sayHello {
NSLog(@"Hello, world!");
}
@end
int main() {
MyClass *myObject = [[MyClass alloc] init];
// 向 myObject 对象发送 sayHello 消息
[myObject sayHello];
return 0;
}
在上面的代码中,我们首先创建了一个 MyClass 类的实例。然后,我们向这个实例发送 sayHello 消息。sayHello 方法在 MyClass 类中定义,所以它可以处理这个消息。
如果我们想让 MyClass 类转发 sayHello 消息给它的父类 NSObject,我们可以这样做:
@interface MyClass : NSObject
- (void)sayHello;
@end
@implementation MyClass
- (void)sayHello {
[super sayHello];
}
@end
在上面的代码中,我们重写了 sayHello 方法。在重写的方法中,我们调用了父类 NSObject 的 sayHello 方法。这样,当我们向 MyClass 类的实例发送 sayHello 消息时,消息就会被转发给 NSObject 类。
总结
消息发送和消息转发是 Objective-C 中非常重要的两个概念。理解这两个概念对于学习 Objective-C 非常重要。