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?

War es hilfreich?

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
scroll top