5

我有一个针对 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]);

现在我创建了一个新项目并将这个库链接到其中。在我的应用程序委托中,我调用了这个方法。我使用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 一起崩溃?

4

1 回答 1

2

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

从 iOS 6 开始,NSArray有一个objectAtIndexedSubscript:方法。对于 iOS 5,此方法由Arclite链接到应用程序的静态库提供(请参阅如何在 iOS 上启用新的 Objective-C 对象文字?以及答案中给出的链接)。但这是 Clang 独有的功能,GCC 不支持 ARC。

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

于 2013-07-03T17:38:36.130 回答