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.
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;