Domanda

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

Come posso ottenere un nuovo NSString da aCFString ?

È stato utile?

Soluzione

NSString e CFStringRef sono "quotati senza pedaggio", il che significa che puoi semplicemente digitare tra loro.

Ad esempio:

CFStringRef aCFString = (CFStringRef)aNSString;

funziona perfettamente e in modo trasparente. Allo stesso modo:

NSString *aNSString = (NSString *)aCFString;

La sintassi precedente era per MRC. Se stai usando ARC, la nuova sintassi del casting è la seguente:

NSString *aNSString = (__bridge NSString *)aCFString;

funziona anche. La cosa fondamentale da notare è che CoreFoundation restituirà spesso oggetti con conteggi di riferimento +1, il che significa che devono essere rilasciati (tutte le funzioni di formato CF [Type] Create lo fanno).

La cosa bella è che in Cocoa puoi tranquillamente usare il rilascio automatico o rilasciarlo per liberarli.

Altri suggerimenti

Se usi ARC nelle ultime versioni di Mac OS X / Obiettivo C, è reale facile:

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

Tuttavia, Xcode ti avviserà felicemente quando proverai a usare il bridge gratuito CFString su NSString e offri di avvolgerlo automaticamente in CFBridgingRelease (), che puoi accettare e lasciare che inserisca automaticamente il wrapper per te se fai clic sull'opzione.

Sono equivalenti, quindi puoi semplicemente lanciare CFStringRef:

NSString *aNSString = (NSString*)aCFString;

Per maggiori informazioni, vedi Toll- Tipi di bridge gratuiti .

In realtà, non dovresti usare Cocoa fidelizzare, rilasciare, rilasciare automaticamente oggetti Core Foundation in generale. Se stai utilizzando Garbage Collection (per ora solo su Mac OS X), le chiamate di conservazione, rilascio e rilascio automatico sono tutte vietate. Quindi perdite di memoria.

Da Apple http: // developer .apple.com / mac / biblioteca / documentazione / cacao / concettuale / GarbageCollection / articoli / gcCoreFoundation.html :

È importante apprezzare l'asimmetria tra Core Foundation e Cocoa, in cui la conservazione, il rilascio e il rilascio automatico non sono operativi. Se, ad esempio, hai bilanciato un CFCreate ... con rilascio o rilascio automatico, perderai l'oggetto in un ambiente di raccolta rifiuti:

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

Al contrario, l'uso di CFRelease per rilasciare un oggetto che hai precedentemente conservato usando la conservazione provocherà un errore di underflow del conteggio dei riferimenti.


PS: non riesco a commentare la risposta di Peter Hosey - scusami per aver aggiunto la mia inutilmente.

Aggiungo che non solo puoi passare da CFString a NSString solo con un cast di tipo, ma funziona anche nell'altro modo. Puoi eliminare il messaggio CFStringCreateWithCString , che è una cosa in meno che devi rilasciare in seguito. (CF utilizza Crea dove Cocoa utilizza alloc , quindi in entrambi i casi sarebbe necessario rilasciarlo.)

Il codice risultante:

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

Stavo riscontrando un problema con ARC e il conteggio dei conteggi di CFStrings. Utilizzando NilObjects la risposta con una leggera modifica ha funzionato perfettamente per me. Ho appena aggiunto conservato ad es.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

Devi lanciarlo:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

Puoi usare: Con CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top