Ho riscontrato problemi con l'attività di memorizzazione di CGGradientRef in NSMutableArray. Cosa devo racchiudere per archiviarlo nell'array e cosa scartarlo.Come memorizzare CGGradientRef in NSMutableArray
Grazie.
Ho riscontrato problemi con l'attività di memorizzazione di CGGradientRef in NSMutableArray. Cosa devo racchiudere per archiviarlo nell'array e cosa scartarlo.Come memorizzare CGGradientRef in NSMutableArray
Grazie.
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.
@property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo;
che in effetti significa "invia -ritorno e -rilascia come se fosse un'istanza di Objective-C".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.
Grazie, risposta grattugia! – Cyprian