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