Odpowiedzi:
NSString i CFStringRef to „bezpłatne połączenie mostkowe”, co oznacza, że można po prostu między nimi przesyłać między nimi.
Na przykład:
CFStringRef aCFString = (CFStringRef)aNSString;
działa doskonale i przejrzyście. Również:
NSString *aNSString = (NSString *)aCFString;
Poprzednia składnia była dla MRC. Jeśli używasz ARC, nowa składnia rzutowania jest następująca:
NSString *aNSString = (__bridge NSString *)aCFString;
działa również. Kluczową rzeczą do zapamiętania jest to, że CoreFoundation często zwraca obiekty z liczbą odwołań +1, co oznacza, że muszą one zostać zwolnione (robią to wszystkie funkcje formatu CF [Type] Create).
Fajną rzeczą jest to, że w kakao możesz bezpiecznie użyć autowydzielania lub zwolnienia, aby je zwolnić.
Jeśli używasz ARC w najnowszych wersjach Mac OS X / Objective C, jest to naprawdę proste:
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
Jednak Xcode z radością ostrzeże Cię, gdy spróbujesz bezpłatnie połączyć most CFString z NSString i zaoferuje automatyczne zawinięcie go w CFBridgingRelease (), którą możesz zaakceptować i automatycznie wstawić opakowanie, jeśli klikniesz tę opcję.
(__bridge NSString *)
wystarczy: nie ma sensu zwiększać liczby retencji o CFBridgingRelease()
.
Są równoważne, więc możesz po prostu rzucić CFStringRef:
NSString *aNSString = (NSString*)aCFString;
Aby uzyskać więcej informacji, zobacz bezpłatne typy mostów .
Właściwie nie powinieneś ogólnie używać Cocoa retain, release, autorelease na obiektach Core Foundation. Jeśli używasz funkcji Garbage Collection (na razie tylko w systemie Mac OS X), wywołania te zachowują, zwalniają i automatycznie zwalniają. Stąd wycieki pamięci.
Ważne jest, aby docenić asymetrię między Core Foundation i Cocoa - gdzie zatrzymywanie, zwalnianie i automatyczne udostępnianie są zabronione. Jeśli, na przykład, zbalansowałeś CFCreate… z wydaniem lub autorelease, obiekt wycieknie w środowisku zbierania śmieci:
NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment
I odwrotnie, użycie CFRelease do zwolnienia obiektu, który został wcześniej zachowany przy użyciu funkcji retain, spowoduje błąd niedomiaru liczby odwołań.
PS: nie mogę komentować odpowiedzi Petera Hoseya - przepraszam, że niepotrzebnie dodałem własną.
Dodam, że nie tylko możesz przejść z CFString do NSString tylko z rzutowaniem typu, ale działa to również w drugą stronę. Możesz porzucić CFStringCreateWithCString
wiadomość, która jest jedną mniejszą rzeczą, którą musisz opublikować później. (CF używa Create
tam, gdzie używa Cocoa alloc
, więc tak czy inaczej, musiałbyś go zwolnić.)
Wynikowy kod:
NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
Możesz użyć: With CFStringRef idc;
NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];