2010-06-29 6 views
2

J'ai un NSMutableDictionary avec la clé étant le premier alphabet du nom d'un objet. La vue est quelque chose comme l'onglet "Contacts" sur l'iPhone. De plus, l'utilisateur peut sélectionner des objets individuels dans la liste.Dois-je libérer tableau renvoyé à partir de [NSMutableDictionary ValueForKey:]

Dans le code, je trouve chaque objet sélectionné pour les traiter davantage.

NSMutableArray *objectsToAdd = [[NSMutableArray alloc] init]; 
NSMutableArray *array  = nil; 

for (NSString *key in self.nameIndex) { 

    array = (NSMutableArray *)[searchedNameDictionary valueForKey:key];  
    for (Objects *eachObject in array) { 
     if (eachObject.objectIsSelected){ 
      [objectsToAdd addObject:eachObject]; 
     } 
    }   
} 
[array release]; 

-(void)dealloc() 
{ 
    [searchedNameDictionary release]; 
} 

L'application se bloque lorsque je libère searchedNameDictionary, avec le message que l'objet désalloué est référencé.

Maintenant, si dans le code ci-dessus, je supprime [tableau version] l'application fonctionne bien.

Ma question est de libérer 'array' est en train de libérer les objets dans searchingNameDictionary, qui est ce qui semble se passer.

La libération d'un tableau n'entraînerait pas de fuite de mémoire?

Répondre

5

Vous ne devez pas release renvoyer un objet sauf s'il provient d'une méthode alloc ou copy.

Les objets retournés sont autoreleased sinon, si vous voulez le garder autour de votre retain immédiatement après l'avoir reçu.

+0

Merci, j'aurais dû appliquer le principe de base de la gestion de la mémoire. Sentez-vous plus confiant avec le code maintenant. Merci encore d'avoir répondu à ma question. – prd

2

array = (NSMutableArray *) [unusedNameDictionary valueForKey: clé];

Ceci renvoie un objet autoreleased, vous n'avez donc pas besoin de le libérer.

Il y a quelques autres ... problèmes avec votre code, mais surtout des choses de style. Débarrassez-vous de la [version de tableau] et vous êtes prêt à aller aussi loin que ce problème est concerné.

+0

Oui, la suppression du [array release] résout le problème car vous avez dit que je libérais un objet autoreleased. À partir de la documentation Apple, j'ai du mal à trouver quand une méthode retourne un objet autoreleased et quand elle ne l'est pas. Y at-il moyen de savoir quel type (autoreleased ou non) d'objet une méthode retourne. – prd

+0

Yup, il suffit de suivre les règles de base. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html "Vous prenez possession d'un objet si vous le créez en utilisant une méthode dont le nom commence par" alloc "ou" new "ou contient" copy "(par exemple, alloc, newObject ou mutableCopy), ou si vous lui envoyez un message de conservation Vous êtes responsable de renoncer à la propriété des objets que vous possédez en utilisant release ou autorelease. vous recevez un objet, vous ne devez pas le libérer. " Cela vaut pour tout. –

Questions connexes