1

だから私はメッセージ転送を調べていくつかの単体テストを実行しています.Apple独自のブランドのドキュメントを含むいくつかの乏しいリソースに出くわしました。forwardInvocation:methodSignatureForSelector:

methodSignatureForSelector:メッセージを転送しようとしているオブジェクトに一致するメソッド名とパラメーターがあるかどうかを確認するために必要な一般的なアイデアが得られたので、私の質問を呼び出すことができforwardInvocation:ますmethodSignatureForSelector:それで...

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    NSMethodSignature* signature = [super methodSignatureForSelector:selector];
    if (!signature) {
        signature = [surrogate methodSignatureForSelector:selector];
    }
    return signature;
}

私には、これは「継承したクラスのいずれにもこのメソッドを処理する方法がない場合は、代理オブジェクトが処理する方法があるかどうかを確認してください」と言っているように見えます。

りんごが示す例は、交渉の方法に関しては、外交官の代わりに戦士が行動することです。この例を考えると、戦士またはその親のいずれかが転送先の適切なメソッド署名を持っているかどうかを確認する理由がわかりません。だから、これは私が考えられない別の理由でそこにあると私に信じさせます.

TL;DR なぜ必要なの[super methodSignatureForSelector:selector];ですか?

4

2 に答える 2

1

そのメッセージを処理しないオブジェクトにメッセージを送信すると、エラーを通知する前に、ランタイムは、NSInvocation オブジェクトを唯一の引数として持つ forwardInvocation: メッセージをオブジェクトに送信します。NSInvocation オブジェクトは、元のメッセージと渡された引数をカプセル化します。それと。

于 2016-05-12T18:58:32.717 に答える