objective-c - 带有 bool 参数的 Objective-C 方法中出现奇怪的 "selector mangling"

标签 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:"

问: 有谁知道这个“选择器重写”的规则或指向我可以找到它们的位置的指针,还是我遗漏了什么?这只是为“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/

相关文章:

objective-c - Cocoa,objective-c 如何调整 png 图像的大小?

objective-c - 如何在函数中排除 iPad 2 和 iPod Touch 5th Generation?

ios - 将自定义 ivar 添加到 iOS 调整

ios - 应用程序终止时处理推送通知

python - MacOS:如何降级 Homebrew Python?

macos - Docker:MacOS 向主机公开容器端口

android - Qt Creator Android Mac OSX 无法编译

linux - 交叉编译编译器何时有意义?

c++ - G++ 4.9.2和8.2.0-具有默认lib路径搜索./../lib目录的最终二进制文件的依赖性(隐式RPATH问题)

gcc - amd64 中的传递参数如何?