Ich versuche zu verstehen, wie man NSString
von einem CFStringRef
in ARC einen bekommt ? Das Gleiche gilt für die entgegengesetzte Richtung, CFStringRef
um NSString
in ARC?
Was ist der richtige Weg, um dies zu tun, ohne Speicherlecks zu verursachen?
CFStringRef foo (__bridge CFStringRef)theNSString;
undNSString *bar = (__bridge NSString *)theCFString;
retain
ing undrelease
Objekte -ing, müssen wir jetzt „schön“ Abgüsse wie verwenden__bridge_transfer
,__unsafe_unretained
und__autoreleasing
. Niemand hat keine Zeit dafür. (Und im Ernst, es ist schwieriger zu lesen. Meiner Meinung nach hat es die Speicherverwaltung überhaupt nicht erleichtert.)Antworten:
Typischerweise
und
Wenn Sie wissen möchten, warum das
__bridge
Schlüsselwort vorhanden ist, lesen Sie die Apple-Dokumentation . Dort finden Sie:Dies bedeutet, dass Sie in den oben genannten Fällen das Objekt umwandeln, ohne den Eigentümer zu ändern. Dies bedeutet, dass Sie in keinem Fall für den Speicher der Zeichenfolgen verantwortlich sind.
Es kann auch vorkommen, dass Sie das Eigentum aus irgendeinem Grund übertragen möchten.
Betrachten Sie zum Beispiel das folgende Snippet
In einem solchen Fall möchten Sie möglicherweise eine speichern,
CFRelease
indem Sie das Eigentum beim Casting übertragen.Das Eigentum an
str
wurde übertragen, daher wird ARC jetzt den Speicher für Sie freigeben.Auf der anderen Art und Weise um Sie werfen können ,
NSString *
um einCFString
mit einem__bridge_retained
gegossenen, so dass Sie das Objekt besitzen werden , und Sie werden ausdrücklich darauf haben zu lösen , indem SieCFRelease
.Zum Abschluss können Sie haben
NSString → CFString
CFString → NSString
quelle
NSString->CFString
sollten wir verwenden__bridge
. aber wannCFString->NSString
sollten wir verwenden__bride_transfer
. ? Und jede Nebenwirkung, wenn wir verwenden,CFRelease
wenn wir nicht auch brauchen. danke :)CFRelease
Ihr Programm vernünftigerweise zum Absturz bringen, da Sie am Ende eine nicht übereinstimmende Aufbewahrungs- / Freigabeoperation haben und schließlich einenNULL
Zeiger freigeben .