Collecte des ordures ménagères des objets de base de la Fondation
-
21-09-2019 - |
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é?
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