Die Freigabe CFStringRef nach dem Gießen zu NSString
Bin ich mit der Konvertierung eines Objective-C-Funktion, die wirft einen CFStringRef zu einem NSString so (wo FSEventStreamCopyDescription gibt eine CFStringRef):
return (NSString *)FSEventStreamCopyDescription(eventStream);
Jedoch bei der Analyse meiner Bewerbung, wurde mir gesagt, dass dies zu einem potentiellen Leck", aufgrund der Abwesenheit einer CFRelease nennen. Ich bin versucht zu umschreiben, die diese Funktion zur Vermeidung von Lecks. Was ist die richtige Art des Umgangs mit diesen? Ich habe zwei Möglichkeiten (die beide könnten falsch sein):
Option A:
CFStringRef ref = FSEventStreamCopyDescription(eventStream);
NSString *desc = [(NSString *)ref copy];
CFRelease(ref);
return [desc autorelease];
Option B:
CFStringRef ref = FSEventStreamCopyDescription(eventStream);
NSString *desc = [[NSString alloc] initWithString:(NSString *)ref];
CFRelease(ref);
return [desc autorelease];
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gießen tut man nicht alles, um das Objekt. Eine Besetzung nur teilt dem compiler mit, "das ist wirklich ein
_____
".Es ist auch nicht alles tun, um das memory-management-Regeln. Haben Sie immer noch ein Objekt, das Sie erhalten aus einer Funktion folgt, dass die CF-Regeln und enthält eine Kopie in seinem Namen. Daher besitzen Sie das Objekt; daher, Sie sind verantwortlich für die Freigabe.
Es ist nicht der name der Klasse, dass Fragen; toll-free bridging bedeutet, dass ein CFString ist einen NSString. Was zählt, ist, was Regeln, die Funktion oder Methode, die Sie bekam das Objekt folgt (CF-Regeln oder Stiftung Regeln), und ob Sie Ihnen gehorchen.
Beiden Optionen A und B das problem lösen, aber mit einem überschuss an Komplexität.
Kopieren und Freigabe in Option A bringt nichts. Sie bereits kopiert; eine weitere Kopie ändert nichts an der situation. Es wird nur Zeit vergeudet, die beide Ihre und die des Benutzers.
Den
initWithString:
(oderstringWithString:
) der Option B erreicht auch nichts. Sie haben bereits einen CFString, und ein CFString ist ein NSString, so dass Sie nicht brauchen zu erstellen eine NSString. Letztlich ist dies äquivalent zu Option A.@kubi ' s Antwort ist die beste, so weit, trägt aber eine Verbesserung:
Mit dieser änderung funktioniert der code korrekt unter garbage collection, wo
autorelease
nichts. Inzwischen unter retain/release RegelnNSMakeCollectable
nichts. So oder so, Ihr Eigentum wird freigegeben/zum richtigen Zeitpunkt erfasst werden.ABRecordCopyValue
in meine eigene Unterklasse vonNSObject
. Kann ich die Warnung ignorieren?CFBridgingRelease
oder den Gegenwert__bridge_transfer
Stimmen.CFBridgingRelease
weil es einfacher ist, auf meine Augen.Entweder wird funktionieren. Meine Vorliebe ist option A.
Können Sie auch verwenden, NSString ' s -stringWithString: Methode liefert dir ein string, der keine automatische Freigabe.
Dritte option: