2010-08-18 7 views
3

J'ai le bloc suivant qui me pose des problèmes dans l'outil de performance: En particulier, il dit que STObject fuit. Je ne suis pas sûr pourquoi?Je ne vois pas pourquoi il y a une fuite de mémoire ici

for (NSDictionary *message in messages) 
{ 
    STObject *mySTObject = [[STObject alloc] init]; 

    mySTObject.stID = [message valueForKey:@"id"]; 

    [items addObject:mySTObject]; 
    [mySTObject release]; mySTObject = nil; 

} 
[receivedData release]; receivedData=nil; 
[conn release]; conn=nil; 

MISE À JOUR:

articles est @property (nonatomic, conserver) sera cette cause le compte retenir être +2?

+2

Que faites-vous avec 'items'? –

+3

Probablement pas dans cette partie. Avez-vous vérifié avec l'analyseur statique? – Eiko

+0

Je passe des articles à mon délégué. il est libéré dans dealloc –

Répondre

-4

Vous définissez mySTObject à zéro après le relâcher ...

 [mySTObject release]; mySTObject = nil; 

juste enlever mySTObject = nil; Je pense qu'il faut que ce soit ..

+0

Ce n'est pas un problème ici. –

+0

Ce serait un bug dans l'outil de fuites. Êtes-vous sûr que cela réglerait le problème? – JeremyP

+0

Je pense qu'il est habitué à l'objectif-c du GC, mais cela l'écraserait dans ce cas. –

4

Avez-vous des variables/propriétés stockées dans STObject? Si vous le faites, vous devrez les libérer dans la méthode "- (void) dealloc" de STObject. Sinon, bien que STObject soit libéré, les variables propres à STObject ne seront pas libérées.

Un exemple de la méthode dealloc sera: à la fin de la méthode

- (void)dealloc { 
    [stID release]; 
    [myVar2 release]; 
    [myVar3 release]; 
    [super dealloc]; 
} 

Assurez-vous également que vous appelez [dealloc super].

+0

+1 Je pense que c'est probablement la réponse, bien que les fuites devraient pointer vers le code STObject à la place. Cependant, les fuites ne sont pas parfaites. – TechZen

+0

Oui, je voudrais aussi regarder la déclaration de propriété pour stID, qui pourrait aussi être retenue ... peut-être. – livingtech

6

Si vous ajoutez un élément à un NSArray ou un NSDictionary, votre mySTObject est conservé, ce qui signifie qu'il existe toujours lorsque vous le libérez, puis que vous le définissez sur zéro. Retirez l'objet du stockage où il est conservé et votre «fuite» est parti.

+0

La libération du tableau aura le même effet, car le tableau libèrera tout ce qu'il contient lorsqu'il sera désalloué. –

+0

Bien sûr, mais l'extrait de code est trop petit pour que je puisse voir ce qu'il fait, essayant juste d'aider. –

+0

Où puis-je libérer le tableau? éléments est dans une classe d'assistance qui est transmise au délégué. Je le libère dans dealloc(). –

0

Si vous êtes sur 10.6, Xcode a "construire et analyser" ce que je trouve est un très bon outil pour le débogage des fuites de mémoire. Documentation disponible here

Questions connexes