我需要在运行时通过反射调用动态恢复方法名称,但是对于某些方法得到了奇怪的结果。
我的 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:"
问: 有人知道这个“选择器重写”的规则,或者我可以在哪里找到这些规则的指针吗?这只适用于“bool”吗? 我还需要知道这种行为是否取决于gcc版本、osx版本或运行时库版本。
我正在使用(gcc --version): i686-apple-darwin10-gcc-4.2.1(GCC)4.2.1(Apple Inc.构建5666)(点3) 在一个(uname -a) 10.8.0 Darwin内核版本10.8.0:
bool
并将其转换为其底层类型名称,没有意识到它是选择器的一部分。你尝试过切换到Clang编译器吗? - Dave DeLong