Objective-C 对象下标、iOS5 和 GCC

标签 objective-c cocoa-touch llvm llvm-gcc

我有一个针对 Apple 的 LLVM 4.2 编译器(Base SDK 6.1)编译的库。其中有对象下标。

假设我的库只有一个类和一种方法。该方法执行此操作:

NSLog(@"****** preTests");
NSDictionary *dictTest = @{ @1 : @1 };
NSLog(@"Initialized Dictionary");
NSArray *arrayTest = @[ @1, @2, @3 ];
NSLog(@"Initialized Array");
NSLog(@"****** arrayTest[1] = %@", arrayTest[1]); // First use of subscripting
NSLog(@"****** dictTest[@1] = %@", dictTest[@1]);

现在我创建一个新项目并链接这个库。在我的应用程序委托(delegate)中,我调用这个方法。我使用 GCC LLVM 4.2 编译器编译此应用程序。它可以很好地编译和链接。

此应用程序将在 iOS 6+ 上正常运行。此应用程序将在 iOS 5 上“首次使用订阅”时崩溃(上文)。

2013-07-03 09:15:51.050 GCCTest[167:707] -[__NSArrayI objectAtIndexedSubscript:]: unrecognized selector sent to instance 0x381fb0

用Apple LLVM 4.2编译器编译,可以正常运行。

objectAtIndexedSubscript:是一种在 iOS 6 中公开可用的方法,据我了解,它是 myArray[0] 的语法糖被翻译成。

谁能帮我理解为什么我看到 GCC 崩溃而不是 Apple 的 iOS 5?我猜它与某处的某些宏有关...是否可以在不编辑我的库代码的情况下不让 GCC 崩溃?

最佳答案

根据"Objective-C Feature Availability Index" , NSArray 下标至少需要 LLVM Compiler 4.0。

从 iOS 6 开始,NSArray 有一个 objectAtIndexedSubscript: 方法。对于 iOS 5, 此方法由链接到应用程序的静态 Arclite 库提供 (参见例如 How to enable the new Objective-C object literals on iOS? 和答案中给出的链接)。 但这是 Clang 独有的特性,GCC 不支持 ARC。

因此,如果主应用程序已编译并与 GCC 链接,我看不出如何使用数组下标。

关于Objective-C 对象下标、iOS5 和 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453518/

相关文章:

android - 将 C 库连接到 iOS 应用程序

ios - 从另一个类重新加载核心数据 TableView

objective-c - UIBarButtonItem 图像(或 UIToolbar 自定义背景图像?..)比原始图像更暗(或更亮?..)

iphone - 从文件中加载文本

makefile - 将 Linux 内核模块编译成 LLVM .bc 位码

llvm - LLVM tablegen中的字段关键字是什么意思?

c++ - LLVM 异常;捕获处理程序未处理,未调用清理

Objective-C:如何从子类访问父属性?

ios - 异步数据调用 & CoreAnimation

objective-c - 创建数字键盘的最佳方式,如 Apples 电话应用程序所示