使用布尔参数的Objective-C方法中的奇怪“选择器修改”

时间:2013-02-03 15:40:09

标签: objective-c macos gcc objective-c-runtime

我需要通过运行时的反射调用动态恢复方法名称。但是对某些人来说会得到奇怪的结果。

我的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:

2 个答案:

答案 0 :(得分:4)

问题在于C99标准标题<stdbool.h>中的一个丑陋的预处理器魔术:

#define bool _Bool

C99定义了一个名为_Bool的类型,其行为类似于C ++的bool类型。 define可以在C中使用它,但使用C ++标识符。

解决方案:

#undef bool

答案 1 :(得分:0)

尝试使用BOOL而不是布尔