2009-09-03 3 views
4

Exécution de l'analyseur statique sur ce morceau de code:Collecte des ordures ménagères Core Foundation objets

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

cède l'avertissement suivant:

appel à la fonction « CFPreferencesCopyAppValue » retourne un objet Core Foundation avec un +1 conserve le compte (référence propriétaire). Les objets Foundation Core ne sont pas automatiquement collectés.

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 comblé sans frais?

Répondre

8

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 ObjC -retain. Un CFRetain désactive la récupération de place de cet objet et nécessite CFMakeCollectable pour l'activer.

+4

Au lieu de lancer CFMakeCollectable(), utilisez NSMakeCollectable(). Mais à part ça, la réponse de kperryua est correcte. Voir aussi: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html –

+0

CFMakeCollectable juste CFRelease l'objet CF. Comme l'objet a été alloué depuis la zone GC, le collecteur gère toujours les objets CF avec un nombre de retenues de 0. (Détails de mise en œuvre, mais ... vous l'avez) – bbum

Questions connexes