Risposte:
NSString e CFStringRef sono "Toll free bridged", il che significa che puoi semplicemente digitare tra loro.
Per 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 di casting è la seguente:
NSString *aNSString = (__bridge NSString *)aCFString;
funziona pure. La cosa fondamentale da notare è che CoreFoundation restituisce 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 utilizzare il rilascio automatico o il rilascio per liberarli.
Se usi ARC nelle ultime versioni di Mac OS X / Obiettivo C, è davvero semplice:
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
Tuttavia, Xcode ti avviserà felicemente quando proverai a caricare gratuitamente il bridge CFString su NSString e ti offrirà di avvolgerlo automaticamente in CFBridgingRelease (), che puoi accettare e lasciarlo inserire automaticamente il wrapper se fai clic sull'opzione.
(__bridge NSString *)
sia sufficiente: non ha senso aumentare il conteggio dei trattenuti CFBridgingRelease()
.
Sono equivalenti, quindi puoi semplicemente lanciare CFStringRef:
NSString *aNSString = (NSString*)aCFString;
Per altre info, vedi 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. Da qui la perdita di memoria.
È 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'utilizzo di CFRelease per rilasciare un oggetto che è stato precedentemente conservato utilizzando la conservazione comporterà 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.
Aggiungerò che non solo puoi passare da CFString a NSString solo con un cast di tipo, ma funziona anche nell'altro modo. Puoi eliminare il CFStringCreateWithCString
messaggio, che è una cosa in meno che devi rilasciare in seguito. (CF usa Create
dove Cocoa usa alloc
, quindi in entrambi i casi, avresti bisogno di rilasciarlo.)
Il codice risultante:
NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
È possibile utilizzare: con CFStringRef idc;
NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];