2010-11-21 16 views

Odpowiedz

12

Nie musisz niczego owijać. Po prostu wyślij go do id i dodaj do tablicy. Możesz to zrobić dla dowolnego typu CoreFoundation pochodzącego z CFType (luźno wszystko kończące się na "Ref").

Alternatywnie można rzucić NSMutableArray * do CFMutableArrayRef i wywołać CFArrayAppendValue(). To już nie jest bezpieczne; wywołuje zwrotne wezwania/zwolnienia określone podczas tworzenia tablicy. (Wyjątkiem wyjątku jest - [NSDictionary setValue: forKey:], który kopiuje klucze, podczas gdy odpowiednia funkcja CFDictionary nie. Czasami dobrze jest mieć słownik wpisany przez "zmienny" obiekt (np. NSURLConnection, z danymi - tak -far jako wartości), jesteś bezpieczny, o ile nie naruszysz wymogu, że hasz się nie zmienia).

Typy CoreFoundation są typami podobnymi do OO, które mogą być używane w "zwykłym" C. Używając jakiejś sprytnej magii (Apple może to zrobić, ponieważ pisze zarówno środowiska wykonawcze CF i ObjC), wystąpienia typów takich jak NSString, NSArray i NSDictionary są (domyślnie) "naprawdę" instancjami CFString, CFArray i CFDictionary. Typy CF są w hierarchii typów, której źródłem jest CFType; godne uwagi metody to CFRetain, CFRelease, CFEqual, CFHash i CFCopyDescription. Te luźno odpowiadają -retain, -release, -isEqual :, -hash i -description (poza tym - opis jest dodatkowo autoreleased i mają one inną obsługę NULL/zero). Apple nazywa to "bezpłatnym mostowaniem" lub "wymiennymi typami danych" (artykuł IDT nie jest już dostępny w Mac Dev Center). Ridiculousfish ma dobry artykuł o nazwie "Bridge".

Oznacza to, że można w większości przypadków traktować typy CF tak, jakby były obiektami Celu-C. Apple nie uczyniło tego szczególnie oczywistym, ale oprócz wszystkich wzmianek o "darmowym pomoście", jest kilka rzeczy, które zakładają, że są wymienne.

  • NSMakeCollectable() przyjmuje i zwraca identyfikator CFTypeRef (i umożliwia zbieranie śmieci, co jest bez znaczenia na iOS, ale bardzo istotne na Mac OS 10.5+).
  • Rzeczy takie jak @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo; co oznacza "wysłanie go -retain i -release tak, jakby była instancją Objective-C".
  • Właściwość CALayer.contents ma typ id, ale jedyną udokumentowaną rzeczą, którą obsługuje, jest CGImageRef (obsługuje również CABackingStore, do czego służy polecenie -drawRect: draws).

Dodatkowe zabawne rzeczy, które możesz zrobić, to zdefiniowanie CFAutorelease.

+0

Dziękuję, dziękuję odpowiedzieć! – Cyprian

Powiązane problemy