Pregunta

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

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

¿Fue útil?

Solución

NSString y CFStringRef son '' Toll free bridged '', lo que significa que puede simplemente escribir entre ellos.

Por ejemplo:

CFStringRef aCFString = (CFStringRef)aNSString;

funciona perfectamente y de forma transparente. Del mismo modo:

NSString *aNSString = (NSString *)aCFString;

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

NSString *aNSString = (__bridge NSString *)aCFString;

también funciona. 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.

Otros consejos

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

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

Sin embargo, Xcode te avisará con gusto cuando intentes hacer un puente gratuito CFString a NSString y ofrecen envolverlo 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 puede lanzar CFStringRef:

NSString *aNSString = (NSString*)aCFString;

Para obtener más información, consulte Toll- Tipos de puente gratuitos .

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 ahora), las llamadas de retención, liberación y liberación automática son todas no operativas. Por lo tanto, pérdidas de memoria.

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

Es importante apreciar la asimetría entre Core Foundation y Cocoa & # 8212; donde la retención, la liberación y la liberación automática no son operacionales. Si, por ejemplo, ha equilibrado un CFCreate & # 8230; con lanzamiento 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 referencias.


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

Agregaré que no solo puedes pasar de CFString a NSString con solo una conversión de tipos, 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];

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.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

Tienes que lanzarlo:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

Puede usar: Con CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top