2011-07-21 2 views
1

J'ai une propriété dans mon fichier d'en-tête commeNSMutableDictionary - « décrément incorrect du compte de référence d'un objet ... »

@property (nonatomic,retain) NSMutableDictionary* e;

et dans mon viewDidLoad: méthode alloué comme

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];. L'analyseur statique XCode est déclenché et indique 'Potential leak of an object...' évidemment. Mais quand je libère l'objet ([self.e release] dans dealloc) l'erreur persiste, mais maintenant il dit aussi qu'il y a un "décrément incorrect du compte de référence", et que cet objet n'appartient pas à l'appelant (mon viewController). L'erreur 'erreur de décrémentation ...' disparaît lorsque je remplace [self.e release] par [e release]. Mais l'ancienne erreur concernant la fuite potentielle est toujours là. Quel est le problème?

Répondre

2

Cette déclaration:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL]; 

est sur- conservant l'objet. Les deux alloc-init et la propriété conservent l'objet. En termes de propriété, vous possédez l'objet renvoyé par alloc-init et en lui envoyant un message de conservation dans l'accesseur de propriété dont vous revendiquez à nouveau la propriété, ce qui entraîne la sur-conservation de l'objet.

Vous pouvez utiliser un constructeur de commodité , qui retourne un objet ans ne possèdent pas, et que la demande accesseur propriété propriété de celui-ci:

self.e = [NSMutableDictionary dictionaryWithContentsOfURL:myURL]; 

Ou utiliser autorelease:

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease]; 

Ou utiliser une variable temporaire:

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL]; 
self.e = tempDict; 
[tempDict release]; 
+0

De même, "[self.e release] in dealloc" est incorrect. Vous devriez libérer l'ivar privé dans dealloc. '[e release]' ou '[_e release]' en fonction de la façon dont vous synthétisez. –

+0

Bien sûr, @JackLawrence. Je n'ai pas mentionné cela parce que l'OP a écrit: "L'erreur" decrement incorrect ... "disparaît quand je remplace" [self.e release] "par simplement" [e release]. "" Donc j'ai supposé que le L'erreur '' decrement incorrect ... '' a été corrigée et n'a expliqué que l'erreur '' Fuite potentielle d'un objet ... ''. – albertamg

0

Le problème est:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL]; 

votre propriété e a le conserver ensemble drapeau. Par conséquent, après l'avoir conservé, vous avez augmenté le nombre de retenues de deux. Vous devez libérer l'objet après l'avoir remis à la propriété.

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease]; 
Questions connexes