funktioniert auch. Das Wichtigste ist, dass CoreFoundation häufig Objekte mit +1 Referenzzählern zurückgibt, was bedeutet, dass sie freigegeben werden müssen (alle CF [Type] Create-Formatfunktionen tun dies).
Das Schöne ist, dass Sie in Cocoa sicher Autorelease oder Release verwenden können, um sie freizugeben.
Xcode warnt Sie jedoch gerne, wenn Sie versuchen, CFString gebührenfrei mit NSString zu verbinden, und bietet an, es automatisch in CFBridgingRelease () zu verpacken, das Sie akzeptieren und den Wrapper automatisch für Sie einfügen lassen können, wenn Sie auf die Option klicken.
Ich bin mir nicht sicher, aber ich denke, es (__bridge NSString *)ist genug: Es macht keinen Sinn, die Anzahl der Aufbewahrungen mit zu erhöhen CFBridgingRelease().
Cœur
12
Sie sind äquivalent, sodass Sie einfach das CFStringRef umwandeln können:
Tatsächlich sollten Sie Cocoa im Allgemeinen nicht für Core Foundation-Objekte verwenden, um sie zu speichern, freizugeben oder automatisch freizugeben. Wenn Sie Garbage Collection verwenden (derzeit nur unter Mac OS X), sind diese Aufbewahrungs-, Freigabe- und Autorelease-Aufrufe allesamt No-Ops. Daher leckt der Speicher.
Es ist wichtig, die Asymmetrie zwischen Core Foundation und Cocoa zu verstehen - wo Retention, Release und Autorelease No-Ops sind. Wenn Sie beispielsweise ein CFCreate… mit Release oder Autorelease ausgeglichen haben, verlieren Sie das Objekt in einer Müllsammelumgebung:
NSString*myString =(NSString*)CFStringCreate...(...);// do interesting things with myString...[myString release];// leaked in a garbage collected environment
Umgekehrt führt die Verwendung von CFRelease zum Freigeben eines Objekts, das Sie zuvor mithilfe von Retain beibehalten haben, zu einem Unterlauffehler bei der Referenzzählung.
PS: Ich kann die Antwort von Peter Hosey nicht kommentieren - entschuldige, dass ich meine eigene unnötig hinzugefügt habe.
Ich füge hinzu, dass Sie nicht nur mit einer Typumwandlung von CFString zu NSString wechseln können, sondern auch umgekehrt. Sie können die CFStringCreateWithCStringNachricht löschen. Dies ist eine Sache weniger, die Sie später veröffentlichen müssen. (CF verwendet dort, Createwo Kakao verwendet allocwird. In beiden Fällen hätten Sie es freigeben müssen.)
Ich hatte ein Problem mit ARC und der Anzahl der CFStrings. Die Verwendung von NilObjects Antwort mit einer leichten Änderung funktionierte perfekt für mich. Ich habe gerade zB beibehalten hinzugefügt.
Wenn Sie ARC verwenden in neueren Versionen von Mac OS X / Objective C, dann ist es echte einfach:
Xcode warnt Sie jedoch gerne, wenn Sie versuchen, CFString gebührenfrei mit NSString zu verbinden, und bietet an, es automatisch in CFBridgingRelease () zu verpacken, das Sie akzeptieren und den Wrapper automatisch für Sie einfügen lassen können, wenn Sie auf die Option klicken.
quelle
(__bridge NSString *)
ist genug: Es macht keinen Sinn, die Anzahl der Aufbewahrungen mit zu erhöhenCFBridgingRelease()
.Sie sind äquivalent, sodass Sie einfach das CFStringRef umwandeln können:
Weitere Informationen finden Sie unter Gebührenfreie überbrückte Typen .
quelle
Tatsächlich sollten Sie Cocoa im Allgemeinen nicht für Core Foundation-Objekte verwenden, um sie zu speichern, freizugeben oder automatisch freizugeben. Wenn Sie Garbage Collection verwenden (derzeit nur unter Mac OS X), sind diese Aufbewahrungs-, Freigabe- und Autorelease-Aufrufe allesamt No-Ops. Daher leckt der Speicher.
Von Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :
Es ist wichtig, die Asymmetrie zwischen Core Foundation und Cocoa zu verstehen - wo Retention, Release und Autorelease No-Ops sind. Wenn Sie beispielsweise ein CFCreate… mit Release oder Autorelease ausgeglichen haben, verlieren Sie das Objekt in einer Müllsammelumgebung:
Umgekehrt führt die Verwendung von CFRelease zum Freigeben eines Objekts, das Sie zuvor mithilfe von Retain beibehalten haben, zu einem Unterlauffehler bei der Referenzzählung.
PS: Ich kann die Antwort von Peter Hosey nicht kommentieren - entschuldige, dass ich meine eigene unnötig hinzugefügt habe.
quelle
Ich füge hinzu, dass Sie nicht nur mit einer Typumwandlung von CFString zu NSString wechseln können, sondern auch umgekehrt. Sie können die
CFStringCreateWithCString
Nachricht löschen. Dies ist eine Sache weniger, die Sie später veröffentlichen müssen. (CF verwendet dort,Create
wo Kakao verwendetalloc
wird. In beiden Fällen hätten Sie es freigeben müssen.)Der resultierende Code:
quelle
Ich hatte ein Problem mit ARC und der Anzahl der CFStrings. Die Verwendung von NilObjects Antwort mit einer leichten Änderung funktionierte perfekt für mich. Ich habe gerade zB beibehalten hinzugefügt.
quelle
Du musst es besetzen:
quelle
Sie können verwenden: Mit CFStringRef idc;
quelle