我需要在运行时通过反射调用动态恢复方法名称。但对某些人来说会得到奇怪的结果。
我的 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. build 5666)(第 3 点) 在 (uname -a) 10.8.0 Darwin 内核版本 10.8.0:
最佳答案
问题出在 C99 标准头文件中丑陋的预处理器魔术 <stdbool.h>
:
#define bool _Bool
C99 定义了一个名为 _Bool
的类型其行为类似于 C++ 的 bool
类型。定义是为了能够在 C 中使用它,但带有 C++ 标识符。
解决方法:
#undef bool
关于objective-c - 带有 bool 参数的 Objective-C 方法中出现奇怪的 "selector mangling",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674163/