2

コード:

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
BOOL initial = YES;
[invocation setArgument:&initial atIndex:2];

質問:

一時変数を作成せずに渡すYESことは可能でしょうか?setArgument:atIndex:

私が認識していない、および/または実行時に定数であり、常にYES指すことができる言語構造があるのではないかと考えていました。

ありがとう!

4

3 に答える 3

6

いいえ、クリーンで信頼できる方法ではありません。

NSInvocationは、送信したポインターを間接参照し、メソッドシグネチャで指定された長さのデータをそこからコピーします。その情報をどこかに持っておく必要があります。そうすれば、その情報へのアドレスを取得できます。ローカル変数を持っていることが、そのための最良の方法です。

于 2012-06-16T06:25:16.040 に答える
0

ポインターは、何か(ガベージを含む)または何も指さない(ポインターがNULLに初期化されることを意味する)必要があります。ポインタは、オブジェクトへの間接的な参照です。ポインタが指すオブジェクトがない場合は、ポインタは必要ないかもしれません。単に呼び出すことができますsetArgument:NULL atIndex:2

コードでそのようなポインターを使用する場合は、出力パラメーターを渡すことです。このパラメーターの値は、呼び出す関数に設定されます。この場合、パラメーターを関数に渡す前にパラメーターを初期化する必要はありません。 、関数はそれに正しい値を割り当てることを処理することになっています。

したがって、あなたの場合、出力パラメーターを使用するつもりがなかった場合は、プリミティブBOOLを関数に渡すだけでよく、ポインターは必要ありません。

編集

NSInvocationのドキュメントを見てみました。答えは他の人と同じです、いいえ。

NSInvocationが正しく機能するには、ポインタを渡す必要があります。ポインタは、既存のオブジェクトを指している必要があります。

于 2012-06-16T06:07:16.987 に答える
0

答えはノーだ。ポインタは、メモリ内のアドレスを指している必要があります。したがって、最初にそのメモリを割り当ててから、その割り当てられたメモリのアドレスをメソッドに送信する必要があります。プリミティブの場合、割り当てられたメモリはスタック上にあり、オブジェクトの場合、オブジェクトに割り当てられたメモリはヒープ上にあり、そのオブジェクトのアドレスはスタックに格納されます。エラーに関しては、void*パラメータを取得しているようですがsetArgument:atIndex:、プリミティブではなくオブジェクトが必要なようです。a を使用しNSNumberて bool を表現しようとしましたか。NSNumberメソッドが付いていnumberWithBool:ます。

于 2012-06-16T06:29:05.717 に答える