2010-11-21 15 views

risposta

12

Non è necessario avvolgerlo in nulla. Basta lanciarlo su id e aggiungerlo all'array. Puoi farlo per qualsiasi tipo di CoreFoundation derivato da CFType (in modo approssimativo qualsiasi cosa che termina con "Ref").

In alternativa, è possibile trasmettere NSMutableArray * a CFMutableArrayRef e chiamare CFArrayAppendValue(). Questo non è più tipologico; chiama i callback di conservazione/rilascio specificati al momento della creazione dell'array. (Un'eccezione degna di nota è la seguente: [NSDictionary setValue: forKey:] che copia le chiavi, mentre la funzione CFDictionary corrispondente no. Occasionalmente è bello avere un dizionario codificato da un oggetto "mutabile" (ad esempio un NSURLConnection, con i dati-così -fino come valori), sei sicuro finché non violerai il requisito che l'hash non cambierà.)

I tipi di CoreFoundation sono tipi OO che possono essere utilizzati in "plain" C. Usando qualche magia intelligente (Apple può farlo perché scrivono sia i runtime CF che ObjC), le istanze di tipi come NSString, NSArray e NSDictionary sono (di default) istanze "realmente" di CFString, CFArray e CFDictionary. I tipi di CF sono in una gerarchia di tipi, la cui radice è CFType; i metodi degni di nota sono CFRetain, CFRelease, CFEqual, CFHash e CFCopyDescription. Questi corrispondono genericamente a -retain, -release, -isEqual :, -hash e -description (tranne che -description è inoltre autorelitta e hanno una diversa gestione di NULL/nil). Apple chiama questo "ponte senza pedaggio" o "Tipi di dati intercambiabili" (l'articolo IDT non è più disponibile su Mac Dev Center, però). Ridiculousfish ha un buon articolo chiamato "Bridge".

Ciò significa che è possibile, per la maggior parte, trattare i tipi di CF come se fossero oggetti Objective-C. Apple non ha reso questo particolarmente ovvio, ma oltre a tutte le menzioni di "ponte senza pedaggio", ci sono alcune cose che presuppongono che siano intercambiabili.

  • NSMakeCollectable() prende un CFTypeRef e restituisce id (e consente la raccolta dei rifiuti, che è irrilevante su iOS, ma di grande rilevanza su Mac OS 10.5 +).
  • Stuff come @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo; che in effetti significa "invia -ritorno e -rilascia come se fosse un'istanza di Objective-C".
  • La proprietà CALayer.contents ha tipo id ma l'unica cosa documentata che supporta è CGImageRef (supporta anche CABackingStore, che è what -drawRect: draws to).

Altre cose divertenti che puoi fare sono la definizione di CFAutorelease.

+0

Grazie, risposta grattugia! – Cyprian

Problemi correlati