iOS - 不能使用'super'作为参考?



我正在尝试使用NSInvocation从子类调用超类方法。 所涉及的代码相对简单,如下所示:

- (NSInvocation*) invocationWithSelector:(SEL)selector {
    NSInvocation* call = [[NSInvocation alloc] init];
    [call retainArguments];
    call.target = super;  //ERROR:  use of undeclared identifier 'super'
    call.selector = @selector(selector);
    return call;
}

这对我来说似乎有点奇怪,因为我一直认为super遵循与self几乎相同的规则(即它可以被视为对相关对象的直接引用并分配给变量,用作返回值等)。 实际上情况似乎并非如此。

无论如何,有没有简单的方法可以让我的NSInvocation以超类实现为目标(我不能使用 self 作为目标,因为子类覆盖了超类方法),还是我需要寻找其他方法?

参见 Objective-C 中的 super 到底是什么?以获取更多信息,但 super 实际上不是一个对象。 Super 是编译器生成 obj-c 运行时调用(特别是 objc_msgSendSuper)的关键字。 基本上,这就像在发送消息之前将类强制转换为其超类。

编辑 因此,如果您覆盖了要调用的方法,则必须编写另一个方法来直接调用 [super method],并将调用设置为调用该方法。 运行时将仅向对象发送消息,并且它们将在实现它们的继承链的最低成员处处理。

superself是同一个对象,所以只需使用

call.target = self;

它们之间的区别在于,您可以将super用作要self的消息的接收方,以确保它调用超类的实现。

最新更新