2013-07-03 21 views
5

Apple'ın LLVM 4.2 derleyicisine (Temel SDK 6.1) karşı derlenmiş bir kitaplığım var. İçinde nesne aboneliği var.Objective-C nesne aboneliği, iOS5 ve GCC

Kitaplığımın tek bir yöntemle yalnızca bir sınıfı olduğunu düşünün. Yani yöntem yapar:

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

Şimdi yeni bir proje oluşturmak ve bu kütüphane bağlantı başvurum temsilci, ben bu yöntemi diyoruz.. Bu uygulamayı GCC LLVM 4.2 derleyicisiyle derledim. İyi derler ve bağlar.

Bu uygulama iOS 6+ üzerinde hatasız olarak çalışır. Bu uygulama, iOS 5’te "İlk abonelik kullanımı" (üstte) olarak kilitlenecek.

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

Elma LLVM 4.2 derleyici ile derlemek ve normal olarak çalışacaktır.

objectAtIndexedSubscript:

iOS 6'da kamuya yapılan bir yöntemdir ve ne myArray[0] sözdizimsel şeker için tercüme benim anlaşılmasıdır.

Birisi neden iOS 5 ile Apple'ı değil de GCC ile bir çöküş gördüğümü anlamamda yardımcı olabilir mi? Sanırım bir yerlerde bazı makrolarla ilgisi var ... Kütüphanemdeki kodu değiştirmeden GCC ile çöküşe uğramadan mı?

+0

Aygıtta veya simülatörde mi çalışıyorsunuz? – Monolo

+0

@Monolo bir cihazda. Tam olarak 5.1.1 çalıştıran bir iPad 1. –

+0

LLVM derleyicisini kullanamayacağınızın özel bir nedeni var mı? –

cevap

2

"Objective-C Feature Availability Index", NSArray aboneliğine göre en az LLVM Derleyici 4.0 gerektirir.

iOS 6 ile başlayan NSArray, objectAtIndexedSubscript: yöntemine sahiptir. IOS 5, için bu yöntem, uygulama 'a bağlı olan statik Arclite kitaplığından sağlanır (bkz. Ör. How to enable the new Objective-C object literals on iOS? ve yanıtta verilen bağlantılar). Ancak bu yalnızca bir Clang özelliğidir, GCC ARC'yi desteklemez.

Yani, ana uygulama derlenmiş ve GCC ile bağlantılıysa dizi aboneliğini nasıl kullanabileceğinizi göremiyorum.

+0

Bu bir * büyük * yardımdır. Yük arkını zorlarsam GCC'de çalışır. Anladığım kadarıyla, GCC'nin ARC kodunu bağlamak için ARC'yi desteklemesi gerekmiyor, çünkü kütüphane derlemesi sırasında "ARC" ile ilgili bir şey dönüştürülüyor. –

+0

Naif yol: Diğer linker bayrakları: -force_load /Applications/Xcode-4.6.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a –

+0

@BenFlynn: Bunu duyduğuma sevindim. ARC'nin esas olarak nesne dosyasına (IOS 5'de libarclite tarafından sağlanan çalışma zamanı desteğini gerektiren) ek kodlar derler, ancak libarclite'i ARC olmayan bir uygulamaya bağlamak için “güvenli” bir şey olup olmadığını bilmiyorum. –