返回

OC底层探索(十四):消息转发:forwardingTargetForSelector

IOS

forwardingTargetForSelector

在上一篇文章中,我们讨论了resolveInstanceMethod方法。resolveInstanceMethod方法负责查找实现方法。如果resolveInstanceMethod方法没有找到实现方法,系统会调用forwardingTargetForSelector方法。forwardingTargetForSelector方法负责查找可以处理该消息的备选对象。

forwardingTargetForSelector方法的声明如下:

- (id)forwardingTargetForSelector:(SEL)aSelector;

forwardingTargetForSelector方法有两个参数:

  • aSelector:要转发的消息选择器。
  • 返回值:可以处理该消息的备选对象。如果找不到备选对象,则返回nil。

forwardingTargetForSelector方法的实现可以是任意的。但是,通常的做法是返回另一个可以处理该消息的对象。这个对象可以是同一个类的另一个实例,也可以是另一个类的实例。

如果forwardingTargetForSelector方法返回nil,系统会调用doesNotRecognizeSelector方法。doesNotRecognizeSelector方法负责处理无法识别的消息。

示例

以下是一个forwardingTargetForSelector方法的示例:

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    if (aSelector == @selector(message)) {
        // 返回另一个可以处理该消息的对象
        return [[OtherClass alloc] init];
    }
    else {
        // 找不到备选对象,返回nil
        return nil;
    }
}

在这个示例中,forwardingTargetForSelector方法检查aSelector是否等于@selector(message)。如果等于,则返回一个OtherClass类的实例。如果aSelector不等于@selector(message),则返回nil。

结论

forwardingTargetForSelector方法是消息转发机制的第二步。forwardingTargetForSelector方法负责查找可以处理该消息的备选对象。备选对象可以是同一个类的另一个实例,也可以是另一个类的实例。如果forwardingTargetForSelector方法找不到备选对象,则系统会调用doesNotRecognizeSelector方法。doesNotRecognizeSelector方法负责处理无法识别的消息。