2011-05-10 3 views
1

Lors de la création d'un NSMutableData j'ai une fuite. Je libérer webData2 dans le connectionDidFinishLoading ...Fuite lors de la création d'un NsMutableData

webData2 = [[NSMutableData alloc]init]; 

donc je dois tester ceci:

NSMutableData *test =[[NSMutableData alloc]init]; 
webData2 = test; 
[test release]; 

et j'ai une fuite sur l'instruction: NSMutableData *test =[[NSMutableData alloc]init];

Je ne comprends pas! Quelqu'un a une idée ?

Merci!

GT

+0

+1 pas pour votre question, mais pour votre poignée. Argh !! – makdad

Répondre

4

Cela ne fonctionnera pas, la référence en webData2 est le même que test et seront libérés.

  1. webData2 = [[NSMutableData alloc]init]; // webData2 points to object A
  2. NSMutableData* test = [[NSMutableData alloc] init]; // test points to object B
  3. webData2 = test; // test and webData2 both points to A, nothing points to B
  4. [test release]; // object B is released, test and webData2 points to garbage

Le problème est à la ligne 3, où vous ne disposez plus d'une référence explicite à l'objet B attribué à la ligne 1.

Vous devez sortir webData2 avant de l'affecter avec un nouveau pointeur d'objet. Comme le souligne bbum, la fuite se réfère toujours à l'endroit où l'objet est alloué, et non là où il a réellement fui.

En cas de doute, utilisez l'analyseur statique (faites toujours tourner l'analyseur statique de temps en temps). Vous le trouverez dans Xcode sous le menu Build en tant que Construire et analyser. Il y aura parmi beaucoup d'erreurs la plupart des fuites de mémoire, et les marquer avec des flèches bleues dans la marge. Élargir les flèches montrera le flux de programme complet pour la fuite de l'allocation à la dernière référence se perdre.

+2

Bonne réponse; notez que les fuites vous indiquent * où * l'objet qui fuit a été alloué, pas où il a été divulgué. Cela déroute parfois les gens. – bbum

0

ce que vous pouvez faire est:

NSMutableData *test =[[NSMutableData alloc]init]; 
webData2 = [test copy]; 
[test release]; 

alors webData2 ne seront pas libérés en même temps avec le test ... vous devrez libérer plus tard.

Questions connexes