オブジェクトに渡されたメッセージをキャプチャするために、NSProxy、forwardInvocation などを設定しました。すべて正常に動作します。
私がやりたいことは、自分自身によって渡されたメッセージをキャプチャすることです。
うまくいかないようです...これは可能ですか?
オブジェクトに渡されたメッセージをキャプチャするために、NSProxy、forwardInvocation などを設定しました。すべて正常に動作します。
私がやりたいことは、自分自身によって渡されたメッセージをキャプチャすることです。
うまくいかないようです...これは可能ですか?
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
これが実際に別のクラスのプロキシであることを判断するほど賢くないため、エラーが発生します。