GNUstep Objective-C Runtime 被设计为 GCC Runtime 的替代品。它支持三种 ABI:
- 旧的 GCC ABI,它提供对 Objective-C 1.0 特性的支持。这可以通过 Clang 中的 -fobjc-runtime=gcc 标志或用 GCC 编译来选择。
- 最初的 GNUstep non-fragile ABI,旨在与 GCC ABI 兼容,但提供对现代 Objective-C 功能的支持。这可以通过 Clang 中的 -fobjc-runtime=gnustep-1.9 标志来选择。
- 现代 (v2) ABI,提供了更丰富的反射元数据、更小的二进制文件和更少的内存使用。这是在 Clang 7.0 或更高版本中用 -fobjc-runtime=gnustep-2.0 标志选择的。
通过在 CMake 配置中将OLDABI_COMPAT
标志设置为 OFF ,可以在不支持旧 ABI 的情况下构建运行时。这将产生一个较小的二进制文件,它不会链接到使用旧 ABI 的代码。
所有 ABI 都支持 GCC 运行时之外的以下功能:
- 现代 Objective-C 运行时 API,最初是在 OS X 10.5 中引入的。
- Blocks
- 合成的属性访问器
- 对 @synchronized() 的有效支持
- 依赖于类型的调度,消除了不匹配的选择器造成的堆栈损坏
- 支持 Mac OS X 10.6 引入的相关参考 API。
- 支持 Mac OS X 10.7 引入的自动引用计数 API