2010-07-26 7 views
1

Je veux préciser s'il y a une fuite de mémoire dans ce code? Autant que je le sens là-bas.Objectif fuite de mémoire

dans le fichier .h

@interface MyClass{ 
    NSMutableArray *dataArray;  
} 

@property(nonatomic,retain) NSMutableArray *dataArray; 

dans le fichier .m

-(id) init{  
    self. dataArray = [[NSMutableArray alloc]init];  
} 

-(void) dealloc{ 
    [self.dataArray release]; 
    [super dealloc]; 
} 

Répondre

0

Prenez les self. « s parce que ceux qui agissent comme les getters, il est pas comme Java ou d'autres langues. Sinon, ça a l'air bien.

+0

Pourquoi le vote vers le bas? Il est généralement considéré comme une bonne pratique de ne pas utiliser les accesseurs de propriété dans init et dealloc mais d'utiliser les ivars. – JeremyP

+0

Oui, mais cette réponse ne l'indique pas, ou explique pourquoi supprimer le "self". corrige la fuite de mémoire ("ce n'est pas Java" n'est pas la réponse :-). [et non, je ne l'ai pas downvote] –

2

Oui, il y a une fuite.

devrait être

self.dataArray = [[[NSMutableArray alloc] init] autorelease]; 

Depuis tableauDonnees est définie comme une propriété retain, en utilisant self.dataArray sur le côté gauche d'une affectation implique retain sur le côté droit.

éditer: ... plus une version sur l'objet précédemment stocké dans self.dataArray, qui est nil au moment de l'appel init.

+0

Yechh. Pourquoi ne pas simplement 'self.dataArray = [tableau NSMutableArray];'? Soit cela ou sinon, 'dataArray = [[NSMutableArray alloc] init];'. Notez que l'expression 'self.dataArray = x' est traduite par le compilateur en' [self setDataArray: x] '. – jlehr

2

Oui, il y a une fuite dans init. dataArray est déclaré avec l'attribut retain. Donc, il conserve le tableau donné. Mais puisque vous l'avez attribué vous le possédez et vous devez le libérer après.

Aussi le dealloc n'est pas bon. Ce code peut tomber en panne dans certaines circonstances (probablement pas ici) parce que vous libérez un objet que vous ne possédez pas.

devrait être quelque chose comme ceci:

-(id) init { 
    NSMutableArray *array = [NSMutableArray new]; 
    self.dataArray = array; 
    [array release]; 
} 

-(void) dealloc { 
    self.dataArray = nil; 
    [super dealloc]; 
} 
+0

Hi nils, Pourquoi ne pas libérer le dataArray dans la méthode deallc? C'est un must ici. –

+0

Puisqu'il s'agit d'une propriété conservée, le setter libère l'ancienne valeur. – nils

+0

Comment '[self.dataArray release]' "libère un objet que vous ne possédez pas"? C'est un idiome assez commun dans dealloc - libérez tous les iVars que vous avez retenus. Vous pourriez argumenter que l'utilisation du setter via 'self.dataArray = nil' est un meilleur style (parce qu'il élimine la référence à l'objet libéré), mais l'effet est le même. –