2013-07-03 16 views
5

Mam bibliotekę, która została skompilowana z kompilatorem LLVM 4.2 firmy Apple (Base SDK 6.1). W nim jest subskrybowanie obiektów.Subskrybowanie obiektów Objective-C, iOS5 i GCC

Wyobraź sobie, że moja biblioteka ma tylko jedną klasę z jedną metodą. Ta metoda umożliwia:

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

Teraz tworzę nowy projekt i łączę tę bibliotekę w. W mojej aplikacji deleguję tę metodę. Kompiluję tę aplikację za pomocą kompilatora GCC LLVM 4.2. Kompiluje i łączy dobrze.

Ta aplikacja będzie działać bez błędów w systemie iOS 6+. Ta aplikacja zawiesi się na iOS 5 w "Pierwsze użycie subskrypcji" (powyżej).

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

Skompiluj go z kompilatorem Apple LLVM 4.2 i będzie działał normalnie.

objectAtIndexedSubscript: to metoda publicznie dostępna w systemie iOS 6 i rozumiem, że to, do czego zostanie przetłumaczony cukier syntaktyczny z myArray[0].

Czy ktoś może mi pomóc zrozumieć, dlaczego widzę awarię z GCC, a nie Apple z iOS 5? Zgaduję, że ma to coś wspólnego z niektórymi makrami ... Czy można to zrobić, aby nie zawieść się z GCC bez edytowania kodu mojej biblioteki?

+0

Czy używasz go na urządzeniu lub w symulatorze? – Monolo

+0

@Monolo na urządzeniu. IPad 1 z 5.1.1, aby być dokładnym. –

+0

Czy istnieje szczególny powód, że nie można używać kompilatora LLVM? –

Odpowiedz

2

Zgodnie z "Objective-C Feature Availability Index", NSArray indeksowanie wymaga co najmniej kompilatora LLVM 4.0.

Począwszy od iOS 6, NSArray ma metodę objectAtIndexedSubscript:. W przypadku iOS 5, ta metoda jest dostarczana przez statyczną bibliotekę Arclite, która jest połączona z aplikacją (patrz np. How to enable the new Objective-C object literals on iOS? i łącza podane w odpowiedzi). Ale to jest funkcja tylko Clang, GCC nie obsługuje ARC.

Nie widzę sposobu, w jaki można zastosować indeksowanie tablic, jeśli główna aplikacja jest skompilowana i połączona z GCC.

+0

To jest * ogromna * pomoc. Jeśli wymuszam ładowanie arclite, działa w GCC. Jak rozumiem, GCC nie musi obsługiwać ARC, aby łączyć się z kodem ARC, ponieważ wszystko "ARC" na jego temat ulega transformacji podczas kompilacji biblioteki. –

+0

Naiwny sposób: Inne znaczniki linkerów: -force_load /Applications/Xcode-4.6.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a –

+0

@BenFlynn: Cieszę się, że to słyszę. Masz rację, że ARC głównie kompiluje dodatkowy kod do pliku obiektowego (który wymaga obsługi środowiska wykonawczego dostarczanego przez libarclite na iOS 5), ale naprawdę nie mam pojęcia, czy "bezpieczne" jest połączenie biblioteki libarclite z aplikacją niezwiązaną z ARC. –

Powiązane problemy