6

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

- (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用作目标,因为子类覆盖了超类方法),还是我需要寻找其他方法?

4

2 回答 2

9

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

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

于 2012-05-14T07:00:09.683 回答
1

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

call.target = self;

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

于 2012-05-14T06:50:24.950 回答