2013-07-03 10 views
5

Ho una libreria compilata con il compilatore LLVM 4.2 di Apple (SDK di base 6.1). In esso c'è l'indice degli oggetti.Sottoscrittore oggetto Objective-C, iOS5 e GCC

Immaginate che la mia libreria abbia solo una classe con un metodo. Tale metodo fa questo:

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]); 

Ora creare un nuovo progetto e collegamento questa biblioteca nel Nella mia applicazione delegato, io chiamo questo metodo.. Compilare questa applicazione con il compilatore GCC LLVM 4.2. Compila e collega bene.

Questa applicazione verrà eseguita senza errori su iOS 6+. Questa applicazione si bloccherà su iOS 5 al "Primo utilizzo di subscripting" (sopra).

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

Compilalo con il compilatore Apple LLVM 4.2 e funzionerà normalmente.

objectAtIndexedSubscript: è un metodo reso disponibile pubblicamente in iOS 6 ed è a mia conoscenza che ciò che viene tradotto lo zucchero sintattico di myArray[0].

Qualcuno può aiutarmi a capire perché vedo un arresto anomalo con GCC e non Apple con iOS 5? Immagino che abbia a che fare con alcuni macro da qualche parte ... Potrebbe essere fatto per non andare in crash con GCC senza modificare il codice della mia libreria?

+0

Lo stai eseguendo sul dispositivo o nel simulatore? – Monolo

+0

@ Monolo su un dispositivo. Un iPad 1 con versione 5.1.1 per essere esatto. –

+0

C'è un motivo particolare per cui non è possibile utilizzare il compilatore LLVM? –

risposta

2

In base allo "Objective-C Feature Availability Index", NSArray l'iscrizione richiede almeno il compilatore LLVM 4.0.

A partire da iOS 6, NSArray ha un metodo objectAtIndexedSubscript:. Per iOS 5, , questo metodo viene fornito dalla libreria statica Arclite collegata all'applicazione (vedere ad esempio How to enable the new Objective-C object literals on iOS? e i collegamenti forniti nella risposta). Ma questa è solo una funzionalità Clang, GCC non supporta ARC.

Quindi non vedo come si possa utilizzare l'indice di sottoscrizione se l'applicazione principale è compilata e collegata a GCC.

+0

Questa è una * enorme * guida. Se forzo carico arclite, viene eseguito in GCC. A quanto ho capito, GCC non ha bisogno di supportare ARC per il collegamento al codice ARC, dal momento che tutto ciò che "ARC" su di esso viene trasformato durante la compilazione della libreria. –

+0

Modo naïve: altri flag linker: -force_load /Applications/Xcode-4.6.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a –

+0

@BenFlynn: Felice di sentirlo. Hai ragione che ARC principalmente compila codice aggiuntivo nel file oggetto (che richiede il supporto di runtime fornito da libarclite su iOS 5), ma non ho davvero idea se sia "sicuro" collegare libarclite in un'applicazione non ARC. –