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”。据我测试,这似乎只适用于“布尔”选择器部分 - 如果我将其更改为 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) (dot 3) on a (uname -a) 10.8.0 Darwin Kernel版本 10.8.0:

4

2 回答 2

4

问题在于 C99 标准头文件中的一个丑陋的预处理器魔法<stdbool.h>

#define bool _Bool

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

解决方案:

#undef bool
于 2013-02-03T16:08:45.860 回答
0

尝试使用 BOOL 而不是 Boolean

于 2013-02-03T15:52:18.057 回答