我需要通过运行时的反射调用动态恢复方法名称。但是对某些人来说会得到奇怪的结果。
我的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:"
问: 有没有人知道规则或指向我可以找到它们的“选择器重写”,或者我错过了什么?这只是为“布尔”做的吗? 我还需要知道这种行为是否取决于gcc-version,osx-version或运行时库版本。
我正在使用(gcc --version): i686-apple-darwin10-gcc-4.2.1(GCC)4.2.1(Apple Inc. build 5666)(第3点) 在一个(uname -a) 10.8.0 Darwin内核版本10.8.0:
答案 0 :(得分:4)
问题在于C99标准标题<stdbool.h>
中的一个丑陋的预处理器魔术:
#define bool _Bool
C99定义了一个名为_Bool
的类型,其行为类似于C ++的bool
类型。 define可以在C中使用它,但使用C ++标识符。
解决方案:
#undef bool
答案 1 :(得分:0)
尝试使用BOOL而不是布尔