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ć.
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ę.
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ć CFStringCreateWithCStringwiadomość, która jest jedną mniejszą rzeczą, którą musisz opublikować później. (CF używa Createtam, gdzie używa Cocoa alloc, więc tak czy inaczej, musiałbyś go zwolnić.)
Miałem problem z ARC i liczbą zachowań CFStrings. Użycie odpowiedzi NilObjects z niewielkimi poprawkami zadziałało dla mnie idealnie. Właśnie dodałem zachowane np.
Jeśli używasz ARC w najnowszych wersjach Mac OS X / Objective C, jest to naprawdę proste:
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ę.
źródło
(__bridge NSString *)
wystarczy: nie ma sensu zwiększać liczby retencji oCFBridgingRelease()
.Są równoważne, więc możesz po prostu rzucić CFStringRef:
Aby uzyskać więcej informacji, zobacz bezpłatne typy mostów .
źródło
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.
Z Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :
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:
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ą.
źródło
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żywaCreate
tam, gdzie używa Cocoaalloc
, więc tak czy inaczej, musiałbyś go zwolnić.)Wynikowy kod:
źródło
Miałem problem z ARC i liczbą zachowań CFStrings. Użycie odpowiedzi NilObjects z niewielkimi poprawkami zadziałało dla mnie idealnie. Właśnie dodałem zachowane np.
źródło
Musisz to rzucić:
źródło
Możesz użyć: With CFStringRef idc;
źródło