0

セレクターと引数を出力するだけで、プロキシオブジェクトに送信されたメッセージをインターセプトしたいと思います。プロキシがそれらを実装しておらず、ターゲットオブジェクトがない場合でも。助けてください。私はいくつかのオプションとAppleドキュメントを見てきましたが、それらはあなたがすでにターゲットオブジェクトを知っていることを前提としています。私はこれをメモリの問題なしにきれいにやりたいと思っています。

 @implementation MyProxy

    -(void)forwardInvocation:(NSInvocation*)anInvocation
        {

        // at this point I would

         //like to fetch the arguments and put on an array 
         NSMutableArray *myArgs = .....;
         NSLog(@"Invoking selector %@", theSelector);
         NSLog (myArgs); // this should print me the list of arguments to the method
        }
@end
         // e.g 
            MyProxy *proxy = [[MyProxy alloc] init];
            [proxy SendMeAnyThing: @"hello"]; // this should print me arguments 
        or [proxy add: 12 to: 89 sub: 89]; // should print the arguments

どうもどうも

4

1 に答える 1

3

引数は、Objective-Cタイプを含め、メソッドに渡される可能性のあるほぼすべてのCタイプです。したがって、それらを配列で表すことはできません。

どこにも宣言されていないメソッドを呼び出すことは意味がないことに注意してください。具体的には、コンパイラは、呼び出しサイトで引数をエンコードして有効なC関数呼び出しを行う方法を知りません(メソッド呼び出しは、実際には単なるC関数呼び出しobjc_msgSend()またはバリアントです)。したがって、「方法が存在しない場合でも、任意の方法」の質問に答えるには、いいえ、それはできません。

ただし、すべてのコンパイラ警告を効果的に排除できます。すべてのコンパイラ警告(すべての「メソッドfoo:bar:が見つかりません」タイプの警告)を削除すると、コンパイラ十分な情報があり、プロキシを使用して必要な処理を実行できることを意味します。

さらに(私があなたの質問をもっと読んだように)、プロキシにメソッドを実装する必要はありません。プロキシは、任意のメソッド呼び出しをNSInvocationに非常にうまく転送できます。正しく記述されていれば、プロキシを問題なく任意のオブジェクトの代わりに使用できます。

あなたがする必要があるのは、のAPIを使用して引数を列挙NSInvocationし、型をサスペンドし、それに応じて各引数をデコードし、適切に出力することです。

numberOfArgumentsNSInvocationインスタンスのメソッドシグネチャを呼び出すことで、引数の数を取得できます(シグネチャはmethodSignatureメソッドを介して取得できます)。

次に、引数をループしgetArgumentTypeAtIndex:、メソッドシグネチャを呼び出して型を取得します。次に、タイプエンコーディングに関するステートメントを記述して、タイプに基づいて適切にswitch()呼び出してデコードします。getArgument:atIndex:

引数0はselfであり、引数1は_cmdであることに注意してください。呼び出されたメソッドのSEL。

于 2009-11-29T05:10:49.383 に答える