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?
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 –
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