Frage

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

Wie kann ich ein neues NSString von aCFString bekommen?

War es hilfreich?

Lösung

NSString und CFStringRef ist "Toll free überbrückt", was bedeutet, dass Sie einfach zwischen ihnen typisieren können.

Zum Beispiel:

CFStringRef aCFString = (CFStringRef)aNSString;

funktioniert perfekt und transparent. Ebenso:

NSString *aNSString = (NSString *)aCFString;

Die bisherige Syntax war für MRC. Wenn Sie ARC verwenden, die neue Casting-Syntax lautet wie folgt:

NSString *aNSString = (__bridge NSString *)aCFString;

funktioniert auch. Der Schlüssel, was zu beachten ist, dass Corefoundation oft Objekte mit +1 Referenzzähler zurück, was bedeutet, dass sie freigegeben werden müssen (alle CF [Typ] diese erstellen Format Funktionen tun).

Das Schöne daran ist, dass in Cocoa Sie sicher Autorelease verwenden können oder lassen Sie sie frei zu machen.

Andere Tipps

Wenn Sie ARC verwenden in neueren Versionen von Mac OS X / Objective C, es ist real einfach:

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

Allerdings Xcode werden Sie glücklich warnen, wenn Sie auf gebührenfreie Brücke versuchen CFString zu NSString und bieten automatisch in CFBridgingRelease wickeln (), mit dem Sie annehmen und lassen Sie es automatisch den Wrapper für Sie ein, wenn Sie die Option klicken.

Sie sind gleichwertig, so können Sie einfach die CFStringRef Stimmen:

NSString *aNSString = (NSString*)aCFString;

Weitere Informationen finden Sie unter Toll- Freie Bridged Typen .

Eigentlich sollte man nicht verwenden Cocoa behalten, lassen Sie, Autorelease auf Core Foundation Objekte in Allgemeinheit. Wenn Sie Garbage Collection verwenden (nur unter Mac OS X jetzt), diejenigen behalten, Freigabe, sind Autorelease Anrufe alle No-ops. Daher Speicherlecks.

von Apple http: // Entwickler .apple.com / mac / library / Dokumentation / Cocoa / Conceptual / GarbageCollection / Artikel / gcCoreFoundation.html :

Es ist wichtig, dass die Asymmetrie zwischen Core Foundation und zu schätzen Cocoa-where behalten, Release und Autorelease sind No-ops. Wenn zum Beispiel haben Sie eine CFCreate ausgewogen ... mit Release oder Autorelease, werden Sie das Objekt in einer Müll gesammelt Umgebung entweichen:

NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment

Im Gegensatz dazu CFRelease mit einem Objekt lösen Sie zuvor erhalten haben, verwendet, werden in einer Referenz zählt Unterlauf Fehler führen zu halten.


PS: kann nicht scheinen, auf Peter Hosey Antwort auf Kommentar - sorry für meine eigenen unnötig Hinzufügen

.

ich will hinzufügen, dass nicht nur Sie von CFString zu NSString gehen mit nur einem Typ-Cast, aber es funktioniert auch in die andere Richtung. Sie können die CFStringCreateWithCString Nachricht fallen, die man weniger, was Sie später lösen müssen, ist. (CF verwendet Create wo Cocoa alloc verwendet, so oder so, hätte man benötigt, es zu veröffentlichen.)

Der resultierende Code:

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

Ich habe ein Problem mit ARC und die Beibehaltungszähler von CFStrings. Mit NilObjects antwortet mit einem leichten zwicken perfekt für mich gearbeitet. Ich behielt zB gerade hinzugefügt haben.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

Sie haben zu werfen:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

Sie können: Mit CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top