6

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サブクラスがスーパークラスのメソッドをオーバーライドするため、ターゲットとして使用できません)、または他のアプローチを探す必要がありますか?

4

2 に答える 2

9

Objective-C の super とは正確には何ですか?を参照してください。詳細については、super は実際にはオブジェクトではありません。Super は、コンパイラが obj-c ランタイム呼び出し (具体的には objc_msgSendSuper) を生成するためのキーワードです。基本的に、メッセージを送信する前にクラスをスーパークラスにキャストするようなものです。

編集したがって、呼び出したいメソッドをオーバーライドした場合は、[スーパーメソッド] を直接呼び出す別のメソッドを作成し、代わりにそのメソッドを呼び出すように呼び出しを設定する必要があります。ランタイムはオブジェクトにのみメッセージを送信し、それらを実装する継承チェーンの最下位のメンバーで処理されます。

于 2012-05-14T07:00:09.683 に答える
1

superselfは同じオブジェクトなので、そのまま使用してください

call.target = self;

それらの違いは、スーパークラスの実装を確実に呼び出す方法としてsuper、メッセージの受信者として使用できることです。self

于 2012-05-14T06:50:24.950 に答える