2011-02-26 7 views
2

Je rencontre un problème avec la gestion de la mémoire dans mon application. J'ai une variable d'instance NSDictionary que je mets égale à un autre NSDictionary qui est fait dans une méthode. Tout fonctionne bien et mon application se comporte comme je le veux, mais j'ai du mal à appliquer la gestion de la mémoire.Objectif-C Mémoire Problème

Si je publie le dictionnaire local, il finit par provoquer un plantage lorsque la méthode est appelée de manière répétée, car les données enregistrées dans la variable d'instance sont également supprimées. Voici le code:

NSBundle *bundle = [NSBundle mainBundle]; 
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"]; 

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
self.dictAllValues = dictionary; 
[dictionary release]; 

Répondre

2

Créer dictAllValues ​​en utilisant

@property(retain) NSDictionary *dictAllValues; 

Votre méthode

-(void) myMethod 
{ 
NSBundle *bundle = [NSBundle mainBundle]; 
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"]; 

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
self.dictAllValues = dictionary; 
[dictionary release]; 
} 

et la libération dans la méthode dealloc

-(void) dealloc 
{ 
[dictAllValues release]; 
[super dealloc]; 
} 
+0

P.S. Si vous modifiez le dictionnaire ... utilisez NSMutableDictionary au lieu de NSDictionary –

1

De l'apple memory management guide. En tant que corollaire de la règle fondamentale, si vous devez stocker un objet reçu en tant que propriété dans une variable d'instance, vous devez le conserver ou le copier. Donc, dans ce cas, mettre [dictionary release]; dans la méthode dealloc à la place (ou toute autre méthode que vous pourriez utiliser pour nettoyer) devrait fonctionner correctement.

Je suppose que votre propriété dictAllValues utilise une affectation simple, faites le moi savoir si ce n'est pas le cas.

+0

Merci pour la réponse rapide, qui explique beaucoup, mais ne sera pas le dictionnaire être hors de portée dans la méthode dealloc? oui, il utilise une affectation simple. est-ce dictAllValues ​​qui doit être libéré dans la méthode dealloc? –

+0

@Justin Que voulez-vous dire, "hors de portée"? En créant un objet via 'alloc', vous devenez propriétaire d'un objet et vous devez donc appeler' release' ou 'autorelease' lorsque vous avez terminé. En ce moment vous signalez "je n'ai plus besoin de cet objet" dans la méthode actuelle et donc l'objet est saccagé (avec son contenu). Si vous prévoyez de l'utiliser plus tard (et vous semblez le faire, comme vous avez créé une propriété locale), enregistrez-le pour l'instant. –

+0

ouais, je sais, c'est ce que j'essaie de faire, mais le dictionnaire est déclaré dans une méthode de classe en tant que variable locale; si je le référence dans - (void) dealloc ça ne va pas savoir de quoi je parle, est-ce que vous vouliez dire [dictAllValues ​​release] dans la méthode dealloc? Je l'ai déjà là-dedans, alors je suppose que ça irait comme ça? –

1

Comment déclarez-vous dictAllValues? En règle générale, il serait:

@property(retain) NSDictionary *dictAllValues; 

Si oui, alors le release dans votre code est correct et votre problème est ailleurs. Publiez la trace arrière de l'accident, utilisez Build and Analyze et corrigez tous les problèmes, et essayez d'activer la détection Zombie.