我有一个针对 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/