cocoa string cfstring

cocoa - Cómo convertir CFStringRef a NSString?



(8)

NSString *aNSString; CFStringRef aCFString; aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding); aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);

¿Cómo puedo obtener un nuevo NSString de aCFString ?


Añadiré que no solo puedes pasar de CFString a NSString solo con un yeso de tipo, sino que también funciona a la inversa. Puede soltar el mensaje CFStringCreateWithCString , que es una cosa menos que necesita lanzar más tarde. (CF usa Create donde Cocoa usa alloc , por lo que de cualquier manera, habría necesitado liberarlo).

El código resultante:

NSString *escapedString; NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];


En realidad, no debe usar Cocoa retener, liberar, liberar automáticamente objetos de Core Foundation en general. Si está utilizando Garbage Collection (solo en Mac OS X por ahora), las llamadas de retención, liberación y liberación automática no son operativas. Por lo tanto, las pérdidas 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 retener, liberar y autorrelease no son operaciones. Si, por ejemplo, ha equilibrado un CFCreate ... con liberación o liberación automática, se 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 anteriormente utilizando retener generará un error de desbordamiento de recuento de referencia.

PD: parece que no puedo comentar la respuesta de Peter Hosey, disculpa por agregar la mía innecesariamente.


Estaba teniendo un problema con ARC y el conteo retenido de CFStrings. Usar la respuesta de NilObjects con un ligero ajuste funcionó perfecto para mí. Acabo de agregar retenido, por ejemplo.

CFStringRef cfstringRef = (__bridge_retained CFStringRef)aNsString;


NSString y CFStringRef son "sin conexión de puente", lo que significa que simplemente puede encasillar entre ellos.

Por ejemplo:

CFStringRef aCFString = (CFStringRef)aNSString;

funciona de manera perfecta y transparente. Igualmente:

NSString *aNSString = (NSString *)aCFString;

La sintaxis anterior era para MRC. Si usa ARC, la nueva sintaxis de conversión es la siguiente:

NSString *aNSString = (__bridge NSString *)aCFString;

funciona también La cuestión clave a tener en cuenta es que CoreFoundation a menudo devolverá objetos con recuentos de referencia de +1, lo que significa que deben ser liberados (todas las funciones de formato de creación de CF [Type] lo hacen).

Lo bueno es que en Cocoa puedes usar la liberación automática o liberarlo para liberarlos.


Puede usar: con CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];


Si está utilizando ARC en versiones recientes de Mac OS X / Objective C, es realmente fácil:

NSString *happyString = (NSString *)CFBridgingRelease(sadString);

Sin embargo, Xcode estará encantado de advertirle cuando intente pegar sin costo el puente CFString a NSString y ofrecerlo para que se ajuste automáticamente en CFBridgingRelease (), que puede aceptar y dejar que inserte automáticamente el contenedor si hace clic en la opción.


Son equivalentes, por lo que puedes lanzar CFStringRef:

NSString *aNSString = (NSString*)aCFString;

Para obtener más información, consulte Tipos puente sin cargo .


Tienes que lanzarlo:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;