2010-11-21 24 views
6

'da CGGradientRef'in saklanması NSMutableArray'da CGGradientRef depolama göreviyle ilgili sorun yaşıyorum. Dizide saklamak için neleri sarmak ve ne için onu açmak zorundayım.NSMutableArray

Teşekkürler.

cevap

12

Hiçbir şeye sarmanız gerekmez. Sadece id'a dökün ve diziye ekleyin. Bunu, CFType'tan türetilen herhangi bir CoreFoundation tipi için yapabilirsiniz ("Ref" ile biten gevşek bir şey). Alternatif olarak, NSMutableArray * öğesini bir CFMutableArrayRef'e atayabilir ve CFArrayAppendValue() yöntemini çağırabilirsiniz. Bu daha güvenli değil; dizi oluşturulduğunda belirtilen tutma/bırakma geri çağrılarını çağırır. (Kayda değer bir istisna istisnası - [NSDictionary setValue: forKey:] tuşları kopyalayan, buna karşılık gelen CFDictionary işlevi yok.Zamanlıkla "mutable" bir nesne ile anahtarlanmış bir sözlüğe sahip olmak güzeldir (örn. Veri ile NSURLConnection, -her değer olarak), karma değişme gereksinimini ihlal etmediğiniz sürece güvendesiniz.)

CoreFoundation türleri, "düz" C'de kullanılabilen OO benzeri türlerdir Zeki bir sihir kullanarak (Apple bunu hem CF hem de ObjC çalışma zamanlarını yazdığı için yapabilir), NSString, NSArray ve NSDictionary gibi türlerin örnekleri (varsayılan olarak) CFString, CFArray ve CFDictionary'ın "gerçekten" örnekleridir. CF türleri bir tür hiyerarşidedir, kökleri CFType; dikkate değer yöntemler CFRetain, CFRelease, CFEqual, CFHash ve CFCopyDescription'dır. Bunlar gevşek bir şekilde -retain, -release, -isEqual:, -hash ve -description'a karşılık gelmektedir (-description ek olarak otomatize edilmiş ve NULL/nil'in farklı kullanımı vardır). Apple bu "ücretsiz bağlantı" veya "Değiştirilebilir Veri Türleri" (IDT makalesi artık Mac Dev Center'da değil) olarak adlandırıyor. Saçma balıkların "Bridge" adlı iyi bir makalesi vardır.

Bunun anlamı, çoğunlukla CF türlerini Objective-C nesneleriymiş gibi ele alabilmenizdir. Apple bunu çok açık bir şekilde ortaya koymadı, ancak "ücretsiz köprüleme" nin tüm sözlerine ek olarak, birbirlerinin yerine geçebileceklerini varsayan bazı şeyler var.

  • NSMakeCollectable() Bir CFTypeRef alır ve kimliğini döndürür (ve iOS'ta alakasız ama Mac OS 10.5+ üzerindeki yüksek oranda alakalı çöp toplama, sağlar).
  • @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo; gibi etkili bir şekilde "bir nesne-C örneğiymiş gibi -retain ve -release gönder" anlamına gelir.
  • CALayer.contents özelliği, id türüne sahiptir, ancak desteklediği tek belgelenmiş şey CGImageRef'dir (ayrıca, CdackingStore'u destekler; bu da -drawRect: çizer).

Yapabileceğiniz ek eğlenceli şeyler arasında CFAutorelease tanımlaması bulunur.

+0

Teşekkür ederim, rendeleyin cevap! – Cyprian

İlgili konular