ARC und CFrelease?
Ich bin etwas verwirrt. Überall wo ich gelesen habe, deuten darauf hin, dass bei der Verwendung von ARC müssen Sie die release-core-foundation-Objekte, die Sinn macht, ARC nicht verwalten. Allerdings habe ich eine Methode, die verwendet einige CF-Methoden/Objekte, die ich verwendet CFRelease
auf, aber dann verursachte die app zum Absturz. Uncommenting meine CFRelease
s behebt das Problem aber dann habe ich ' m vorausgesetzt, ich habe da ein memory-leak?
Könnte mir bitte jemand erklären, welche Dinge loslassen müssen und welche nicht, oder alles andere, was falsch an diesem code?
+ (NSString *) fileExtensionForMimeType:(NSString *)type
{
CFStringRef mimeType = (__bridge CFStringRef)type;
CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL);
CFStringRef extension = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension);
NSString *ext = (__bridge NSString *)extension;
//CFRelease(mimeType);
//CFRelease(uti);
//CFRelease(extension);
return ext;
}
Den drei auskommentiert CFRelease
fordert, das Problem zu beheben, wie bereits erwähnt, aber ich weiß, es ist falsch. Was soll ich tun?
InformationsquelleAutor der Frage PaReeOhNos | 2012-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht loslassen
mimeType
weil Sie nicht besitzen es. Sie hat nicht die übertragung des Eigentums mit der__bridge
Stimmen.Sollten Sie die Freigabe
uti
da Sie ihn erstellt haben.Sollten Sie auch release
extension
seit Sie es erstellt haben, aber das wird wahrscheinlich dazu führen, dass Probleme mitext
. Stattdessen überträgt das Eigentum anext
.Ich würde vorschlagen, die folgenden:
InformationsquelleAutor der Antwort rmaddy
Check-out WWDC 2012 - Modern Objective-C die Umrisse neuen Richtlinien für die Core-Foundation-Objekte und BOGEN. Es ist etwa 37:35 in diesem video. In kurzen, Core Foundation-Funktionen mit
Copy
oderCreate
im Namen ein Objekt erstellen, übertragen das Eigentum an die app, und Ihre Anwendung ist verantwortlich für die Freigabe.Sowieso, wenn Eigentum übertragen wurde, über ein Core-Foundation-Methode mit
Copy
oderCreate
im Namen, Sie können lassen Sie es manuell mitCFRelease
wenn du fertig bist mit ihm, oder, einfacher, kann man die übertragung von Eigentum an BOGEN und lassen Sie ihn kümmern. Historisch gesehen, zur übertragung des Eigentums an ARC, verwendeten wir__bridge_transfer
aber Sie empfehlen nunCFBridgingRelease
(obwohl die letztere nur ein makro für den ehemaligen). Und, natürlich, wenn Sie haben einige Core-Foundation-Objekt, das Sie abgerufen werden, die über einen anderen Mechanismus anderes als eine Funktion mitCopy
oderCreate
im Namen, sollten Sie wederCFRelease
es noch die übertragung von Eigenverantwortung ARC.Veranschaulichung, diese Methode leistet, was Sie wollen:
InformationsquelleAutor der Antwort Rob
In der Regel sprechen, ich denke, Sie sollten versuchen, zu kommentieren, die ersten CFRelease(mimeType) Linie, und heben Sie die Auskommentierung der gefolgt zwei Linien: CFRelease(uti) und CFRelease(Erweiterung). Sie warf einen gebührenfreien Brücke zum Eingang NSString und BOGEN sich um die Veröffentlichung. Aber die uti und Erweiterung erstellt/kopiert werden, so CFString. ARC wird nicht wissen, wie Sie zu behandeln (Sie erinnern sich ARC ist eine compiler-Funktion für NSObject), so müssen Sie die CF-Version.
InformationsquelleAutor der Antwort onevcat