返回

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

IOS

消息发送

在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 非常重要。