Aquí podría ser tu PUBLICIDAD


Cómo convertir CFStringRef a NSString?

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

¿Cómo puedo obtener una nueva NSStringa partir de aCFString?

Publicado el 12/03/2009 a las 21:33
fuente por usuario papr
En otros idiomas...        العربية       

8 respuestas

votos
335

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.

Respondida el 12/03/2009 a las 09:37
fuente por usuario NilObject


Aquí podría ser tu PUBLICIDAD


votos
15

Si está utilizando ARC en las últimas versiones de Mac OS X / Objective C, que es verdadera fácil:

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

Sin embargo, Xcode estará feliz de advertirle cuando intenta peaje del puente libre CFString a NSString y ofrece se ajuste automáticamente en CFBridgingRelease (), que puede aceptar y dejar que se introduzca automáticamente el contenedor para que si hace clic en la opción.

Respondida el 01/03/2013 a las 02:38
fuente por usuario clearlight

votos
12

Son equivalentes, por lo que puedes lanzar CFStringRef:

NSString *aNSString = (NSString*)aCFString;

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

Respondida el 12/03/2009 a las 09:37
fuente por usuario Martin Cote

votos
4

En realidad, no se debe utilizar cacao retener, liberar, autorelease en los objetos base fundamental de la generalidad. Si está utilizando Recolección de basura (sólo en Mac OS X, por ahora), los retienen, liberación, llamadas autorelease son todos los no-ops. Por lo tanto, pérdidas de memoria.

De Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :

Es importante tener en cuenta la asimetría entre la Fundación Core y cacao en retener, liberar y autorelease hay-ops. Si, por ejemplo, se han equilibrado con un CFCreate ... liberación o autorelease, se le escape el objeto en un entorno de basura recogida:

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 ha conservado previamente usando retener dará lugar a un error de desbordamiento de recuento de referencia.


PD: parece que no puede hacer comentarios sobre la respuesta de Peter Hosey - lo siento por la adición de mi propio innecesariamente.

Respondida el 15/04/2010 a las 11:01
fuente por usuario gavinbeatty

votos
3

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 CFStringCreateWithCStringmensaje, que es una cosa menos que necesita lanzar más tarde. (CF usa Createdonde usa Cocoa alloc, por lo que de todas formas, habría necesitado liberarlo).

El código resultante:

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
Respondida el 13/03/2009 a las 01:27
fuente por usuario Peter Hosey

votos
2

Estaba teniendo un problema con la ARC y el recuento de retener CFStrings. Utilizando NilObjects respuesta con una ligera inclinación funcionaba perfecto para mí. Acabo de añadir retenido por ejemplo.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;
Respondida el 05/07/2012 a las 11:00
fuente por usuario dloomb

votos
0

Usted tiene que echarlo:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;
Respondida el 29/10/2012 a las 10:12
fuente por usuario Vincent

votos
-3

uso youcan: Con CFStringRef IDC;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
Respondida el 17/10/2013 a las 06:19
fuente por usuario vualoaithu