Die Garbage-Collection von Core Foundation Objekte
-
21-09-2019 - |
Frage
Ausführen des statischen Analysators auf diesem Stück Code:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)matchStyle autorelease];
}
ergibt die folgende Warnung:
Aufruf zur Funktion ‚CFPreferencesCopyAppValue‘ liefert ein Core Foundation-Objekt mit einem +1 Zählung beibehalten (Referenz) zu erreichen. Core Foundation-Objekte werden nicht automatisch Müll gesammelt.
Ist das eine Warnung, die ich mit somethin hässlich wie die in Ordnung bringen sollte:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
id nsMatchStyle = [(id)matchStyle copy];
if (matchStyle) {
CFRelease(matchStyle);
}
return [nsMatchStyle autorelease];
}
oder ist dies nur ein falsch positives Ergebnis, da das kopierte Objekt ist gebührenfrei überbrückt?
Lösung
Versuchen Sie diese:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)CFMakeCollectable(matchStyle) autorelease];
}
Ohne die CFMakeCollectable
, wird dies in GC auslaufen, weil ein CFRetain
anders ist als ein ObjC -retain
. Eine CFRetain
deaktiviert Garbage Collection des Objekts und muß CFMakeCollectable
es aktivieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow