2011-09-01 7 views
0

Je implémente une méthode pour retourner un dictionnaire dans mon application. Mais je trouve une fuite de mémoire en utilisant un instrument, j'ai essayé de le comprendre, mais je n'arrive toujours pas à le trouver. Quelqu'un peut m'aider?NSDictionary Les fuites de mémoire

Merci à l'avance, voici le code pour que les méthodes:

-(NSMutableDictionary *)initDict 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 
    [dict setObject:self.name forKey:@"Name"]; 
    //Some similar set object for key here... 
    return dict; 
} 

Je pense que le problème est de allocing mémoire pour dict et non le relâcher. Mais dans la méthode, il semble que je ne peux pas libérer dict. Donc, y a-t-il une méthode pour réparer la fuite?

Répondre

2

Toutes les variantes sont bonnes. Voici la troisième variante (choisir judicieusement):

Remplacer

NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 

avec

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
+0

'dictionary]' est un synonyme de 'init] autorelease]'; vous devriez probablement utiliser cette version au-dessus des appels explicites 'autorelease' parce que l'objet est créé dans la même portée où il est renvoyé/autoreleased, ce qui est le cas d'utilisation prévu de l'initialiseur' dictionary] '(un objet temporaire). – darvids0n

+0

vous avez résolu la dernière de mes 50 fuites de mémoire merci. Je n'ai jamais su cela et je vous en remercie grandement. Je pense que cela doit être mis à jour beaucoup. – Rob

1

Je pense que vous avez juste besoin de changer la dernière ligne de initDict à ceci:

return [dict autorelease]; 
+0

+1 Ceci est utile si l'objet est initialisé dans la même portée mais il est passé ailleurs avant le retour ' 'déclaration, et il y a un risque qu'il soit dans un 'NSAutoreleasePool' qui est' drainé', le désaffectant ainsi. Cela ne devrait pas être un problème, parce que les pools d'autorelease sont empilés pour éviter ce genre de problème de désallocation, mais il y a probablement un cas limite auquel je ne peux pas penser maintenant, où vous devez vous assurer qu'il est correctement conservé. – darvids0n

0

Lorsque vous créez un objet dans votre fonction et que vous voulez les renvoyer alors vous devez toujours créer d'une manière que ces objets sont auto-libérés. Donc, vous devriez changer votre code comme ci-dessous.

NSMutableDictionary *dict = [[[NSMutableDictionary alloc]init]autorelease]; 

Donc chaque fois que vous créez une méthode objet juste appeler autorelease sur ce point.