funciona igual de bien La cuestión clave a tener en cuenta es que CoreFoundation a menudo devolverá objetos con recuentos de referencia +1, lo que significa que deben liberarse (todas las funciones de formato CF [Type] Create hacen esto).
Lo bueno es que en Cocoa puedes usar de forma segura la liberación automática o liberar para liberarlos.
Sin embargo, Xcode le avisará con gusto cuando intente llamar sin cargo el puente CFString a NSString y le ofrecerá envolverlo automáticamente en CFBridgingRelease (), que puede aceptar y dejar que inserte automáticamente el contenedor si hace clic en la opción.
En realidad, no debe utilizar la retención, liberación y liberación automática de Cocoa en los objetos de Core Foundation en general. Si está utilizando Garbage Collection (solo en Mac OS X por el momento), las llamadas de retención, liberación y liberación automática no son operativas. De ahí la pérdida de memoria.
Es importante apreciar la asimetría entre Core Foundation y Cocoa, donde la retención, la liberación y la liberación automática no son operacionales. Si, por ejemplo, ha equilibrado un CFCreate ... con liberación o liberación automática, filtrará el objeto en un entorno de recolección de basura:
NSString*myString =(NSString*)CFStringCreate...(...);// do interesting things with myString...[myString release];// leaked in a garbage collected environment
Por el contrario, el uso de CFRelease para liberar un objeto que haya retenido previamente usando retener dará como resultado un error de desbordamiento del recuento de referencia.
PD: parece que no puedo comentar la respuesta de Peter Hosey, perdón por agregar la mía innecesariamente.
Agregaré que no solo puede pasar de CFString a NSString con solo un tipo de conversión, sino que también funciona a la inversa. Puede soltar el CFStringCreateWithCStringmensaje, que es una cosa menos que necesita publicar más tarde. (La CF se usa Createdonde usa Cocoa alloc, por lo que, de cualquier manera, habría necesitado liberarla).
Estaba teniendo un problema con ARC y el conteo retenido de CFStrings. Usar la respuesta de NilObjects con un ligero ajuste funcionó perfectamente para mí. Acabo de agregar retenido por ejemplo.
Si está utilizando ARC en versiones recientes de Mac OS X / Objective C, es realmente fácil:
Sin embargo, Xcode le avisará con gusto cuando intente llamar sin cargo el puente CFString a NSString y le ofrecerá envolverlo automáticamente en CFBridgingRelease (), que puede aceptar y dejar que inserte automáticamente el contenedor si hace clic en la opción.
fuente
(__bridge NSString *)
es suficiente: no tiene sentido aumentar el conteo de retenciónCFBridgingRelease()
.Son equivalentes, por lo que puede lanzar CFStringRef:
Para obtener más información, consulte Tipos de puente gratuitos .
fuente
En realidad, no debe utilizar la retención, liberación y liberación automática de Cocoa en los objetos de Core Foundation en general. Si está utilizando Garbage Collection (solo en Mac OS X por el momento), las llamadas de retención, liberación y liberación automática no son operativas. De ahí la pérdida de memoria.
De Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :
Es importante apreciar la asimetría entre Core Foundation y Cocoa, donde la retención, la liberación y la liberación automática no son operacionales. Si, por ejemplo, ha equilibrado un CFCreate ... con liberación o liberación automática, filtrará el objeto en un entorno de recolección de basura:
Por el contrario, el uso de CFRelease para liberar un objeto que haya retenido previamente usando retener dará como resultado un error de desbordamiento del recuento de referencia.
PD: parece que no puedo comentar la respuesta de Peter Hosey, perdón por agregar la mía innecesariamente.
fuente
Agregaré que no solo puede pasar de CFString a NSString con solo un tipo de conversión, sino que también funciona a la inversa. Puede soltar el
CFStringCreateWithCString
mensaje, que es una cosa menos que necesita publicar más tarde. (La CF se usaCreate
donde usa Cocoaalloc
, por lo que, de cualquier manera, habría necesitado liberarla).El código resultante:
fuente
Estaba teniendo un problema con ARC y el conteo retenido de CFStrings. Usar la respuesta de NilObjects con un ligero ajuste funcionó perfectamente para mí. Acabo de agregar retenido por ejemplo.
fuente
Tienes que lanzarlo:
fuente
Puede usar: Con CFStringRef idc;
fuente