1

オブジェクトに渡されたメッセージをキャプチャするために、NSProxy、forwardInvocation などを設定しました。すべて正常に動作します。

私がやりたいことは、自分自身によって渡されたメッセージをキャプチャすることです。

うまくいかないようです...これは可能ですか?

4

1 に答える 1

2

selfまたはプロキシを指す別の変数を介してプロキシ インスタンスにメッセージを送信することも例外ではありません。内部では、各メッセージ ディスパッチはobjc_msgSend()関数呼び出しに変換され、インスタンスのアドレスを受信者として渡します。そのため、それぞれがポイントしている限り、self を使用するか「外部変数」を使用するかは問題ではありません。同じオブジェクトに。

念のため、NSObject サブクラス (TestObject) にメッセージを転送する NSProxy サブクラス (TestProxy) を実装して、これをテストしました。TestObject には、オブジェクトの説明を出力するカスタム メソッドが 1 つあります。

@interface TestObject : NSObject
- (void)printDescription;
@end

プロキシには次のメソッドがオーバーライドされています (_theObject は、プロキシされる TestObject インスタンスです)。

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL selector = [anInvocation selector];

    if ([_testObject respondsToSelector:selector])
        [anInvocation invokeWithTarget:_testObject];
}

- (BOOL)respondsToSelector:(SEL)aSelector
{
    return [_testObject respondsToSelector:aSelector];
}

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    return [_testObject methodSignatureForSelector:selector];
}

経由でプロキシに printDescription メッセージを送信するとself、メッセージ呼び出しが _theObject に正しく転送されます。

[((id)self) printDescription];

selfメッセージをにキャストせずに に直接送信しようとすると、コンパイラがエラーを返すという問題があった場合、id私の推測では、それを解決する方法はありません。コンパイラは (プロキシ) のクラスのインターフェイスでメソッドを検出できず、selfこれが実際に別のクラスのプロキシであることを判断するほど賢くないため、エラーが発生します。

于 2012-11-30T14:10:07.213 に答える