3

実行時にリフレクション呼び出しを介してメソッド名を動的に回復する必要があります。しかし、一部の人にとっては奇妙な結果が得られます。

私の TestClass には、次のようなメソッドが含まれています。

- (void)testMethod6_NSRect:(NSRect)a1 int:(int)a2 int:(int)a3 bool:(Boolean)a4 {
    ...
}

class_copyMethodList() を使用して上記のクラス メソッドを列挙し、method_getName() を介してメソッド セレクターを取得すると、次のようになります。

"testMethod6_NSRect:int:int:_Bool:" 

そのため、セレクターは何らかの形で (gcc? によって) 書き直され、"bool" から "_Bool" が作成されました。私がまだテストした限り、これは「bool」セレクター部分に対してのみ行われるようです-次のようにint:(int)に変更すると:

- (void)testMethod1_int:(int)a1 int:(int)a2 int:(int)a3 int:(int)a4 {
    ...
}

私は期待される:

"testMethod1_int:int:int:int:"

Q: この「セレクターの書き換え」のルールまたはルールを見つけることができる場所へのポインタを知っている人はいますか? それとも、何か不足していますか? これは「ブール」に対してのみ行われますか?また、この動作が gcc バージョン、osx バージョン、またはランタイム ライブラリ バージョンに依存しているかどうかを知る必要があります。

(gcc --version) を使用しています: i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. ビルド 5666) (ドット 3) on a (uname -a) 10.8.0 Darwin Kernelバージョン 10.8.0:

4

2 に答える 2

4

問題は、C99 標準ヘッダーの醜いプリプロセッサ マジックにあります<stdbool.h>

#define bool _Bool

C99 は、_BoolC++ のbool型のように動作する名前付きの型を定義します。Cで使用できるように定義されていますが、C++識別子を使用しています。

解決:

#undef bool
于 2013-02-03T16:08:45.860 に答える
0

ブール値の代わりに BOOL を使用してみてください

于 2013-02-03T15:52:18.057 に答える