Question

Exécution de l'analyseur statique sur ce morceau de code:

- (id) readForeignPref
{
 CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
 return [(id)matchStyle autorelease];
}

donne l'avertissement suivant:

  

Appel à la fonction « CFPreferencesCopyAppValue » retourne un objet Core Foundation avec un compte +1 conserver (référence posséder). objets de base de la Fondation ne sont pas automatiquement collectées déchets.

Est-ce un avertissement que je devrais fixer avec somethin laid comme ça:

- (id) readForeignPref
{
 CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
 id nsMatchStyle = [(id)matchStyle copy];
 if (matchStyle) {
  CFRelease(matchStyle);
 }
 return [nsMatchStyle autorelease];
}

ou est-ce juste un faux positif, étant donné que l'objet copié est sans frais comblé?

Était-ce utile?

La solution

Essayez ceci:

- (id) readForeignPref
{
      CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
      return [(id)CFMakeCollectable(matchStyle) autorelease];
}

Sans CFMakeCollectable, ce fuira GC, parce qu'un CFRetain est différent d'un -retain ObjC. Un CFRetain désactive la collecte des ordures de cet objet, et a besoin CFMakeCollectable pour l'activer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top