2010-11-21 8 views

Respuesta

12

No tiene que envolverlo en nada. Simplemente transfiéralo a id y añádalo a la matriz. Puede hacer esto para cualquier tipo de CoreFoundation derivado de CFType (cualquier cosa que termine en "Ref").

Alternativamente, puede convertir NSMutableArray * a CFMutableArrayRef y llamar a CFArrayAppendValue(). Esto no es más seguro; llama a las devoluciones de llamada retención/liberación especificadas cuando se crea la matriz. (Una excepción de excepción notable es - [NSDictionary setValue: forKey:] que copia claves, mientras que la correspondiente función CFDictionary no lo hace. De vez en cuando es agradable tener un diccionario codificado por un objeto "mutable" (por ejemplo, una NSURLConnection, con los datos, por lo -fáciles como valores); está seguro siempre que no infrinja el requisito de que el hash no cambie.)

Los tipos de CoreFoundation son de tipo OO que se pueden usar en C. "simple". Utilizando alguna magia inteligente (Apple puede hacer esto porque escriben los tiempos de ejecución de CF y ObjC), las instancias de tipos como NSString, NSArray y NSDictionary son (de forma predeterminada) instancias "realmente" de CFString, CFArray y CFDictionary. Los tipos de CF están en una jerarquía de tipos, cuya raíz es CFType; los métodos notables son CFRetain, CFRelease, CFEqual, CFHash y CFCopyDescription. Estos corresponden a -retain,-release, -isEqual :, -hash, y -description (excepto que -description también se libera automáticamente, y tienen un manejo diferente de NULL/nil). Apple llama a esto "puente libre de costo" o "Tipos de datos intercambiables" (sin embargo, el artículo de IDT ya no está en el Centro de desarrollo de Mac). Ridiculousfish tiene un buen artículo llamado "Bridge".

Lo que esto significa es que, en su mayor parte, puede tratar los tipos de CF como si fueran objetos Objective-C. Apple no lo ha hecho particularmente obvio, pero además de todas las menciones de "puentes sin cargo", hay algunas cosas que asumen que son intercambiables.

  • NSMakeCollectable() realiza un CFTypeRef y devuelve id (y permite la recolección de basura, que es irrelevante en iOS pero de gran trascendencia en Mac OS 10.5 +).
  • Cosas como @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo; que efectivamente significa "enviarlo -retain and -release como si fuera una instancia de Objective-C".
  • La propiedad CALayer.contents tiene el tipo id pero lo único documentado que admite es CGImageRef (también es compatible con CABackingStore, que es a lo que -drawRect: se refiere).

Otras cosas divertidas que puede hacer incluyen la definición de CFAutorelease.

+0

¡Gracias, gracias! – Cyprian

Cuestiones relacionadas