2013-07-03 21 views
5

我有一個針對Apple的LLVM 4.2編譯器(Base SDK 6.1)編譯的庫。其中有對象下標。Objective-C對象下標,iOS5和GCC

想象一下,我的圖書館只有一個類的方法。該方法做到這一點:

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 iOS 5?我猜它必須在某處使用某些宏...如果不編輯我的庫的代碼,是否可以不使用GCC崩潰?

+0

你在設備上還是在模擬器上運行它? – Monolo

+0

@Monolo在設備上。準確地運行5.1.1的iPad 1。 –

+0

是否有一個特殊的原因,您不能使用LLVM編譯器? –

回答

2

根據"Objective-C Feature Availability Index"NSArray下標至少需要LLVM Compiler 4.0。

從iOS 6開始,NSArray有一個objectAtIndexedSubscript:方法。對於iOS 5, ,此方法由鏈接到應用程序 (請參閱(例如)How to enable the new Objective-C object literals on iOS?以及答案中給出的鏈接)的靜態Arclite庫提供。 但這是一個鏗鏘獨特的功能,GCC不支持ARC。

所以我不明白如何使用數組下標,如果主應用程序編譯並鏈接到GCC。

+0

這是一個*巨大的*幫助。如果我強制加載arclite,它將在GCC中運行。據我瞭解,GCC不需要支持ARC鏈接到ARC代碼,因爲在編譯庫期間,關於它的任何「ARC」都會被轉換。 –

+0

幼稚的方式:其他鏈接器標誌:-force_load /Applications/Xcode-4.6.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a –

+0

@BenFlynn:很高興聽到這一點。 ARC主要將額外的代碼編譯到目標文件中(這需要iOS 5上的libarclite提供運行時支持),但是我真的不知道將libarclite鏈接到非ARC應用程序是否「安全」。 –