2010-02-14 11 views
0

J'ai un plist. Il dispose de plusieurs touches douzaine, chacun avec des éléments NSMutableArray:NSMutableDictionary removeObjectForKey lancer EXC_BAD_ACCESS pour un var qui n'est pas libéré

... 
<key>KeyName1</key> 
<array> 
    <string>String1</string> 
    <string>String2</string> 
    <string>String3</string> 
</array> 

<key>KeyName2</key> 
<array> 
    <string>String1</string> 
    <string>String2</string> 
    <string>String3</string> 
</array> 
... 

J'ai besoin d'enlever « String1 » pour toutes les clés. Ceci est la fonction que j'ai écrit:

void DeleteString(NSString *StringToDelete){ 
NSMutableDictionary *item=nil; 

item = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

for (id obj in item){ 
    NSString *removeThisObject=(NSString *)obj; 
    NSArray *ObjectArray = [item objectForKey:obj]; 

    for (int i = 0; i< [ObjectArray count]; i++){ 
     NSString *objectString = [ObjectArray objectAtIndex:i]; 

     if([objectString isEqualToString:StringToDelete]){    
      NSLog(@"Remove This from Item Dictionary: %@",removeThisObject); 

      [item removeObjectForKey:obj];   
     } 
    } 

} 
[item writeToFile:filePath atomically: YES]; 
[item release]; 

}

je me suis dit qu'il serait plus facile d'enlever seulement la clé entière si elle comporte une valeur que je ne veux pas, mais la ligne: article [ removeObjForKey: obj] lance un EXC_BAD_ACCESS.

Cela n'a pas de sens pour moi parce que, si je comprends bien EXC_BAD_ACCESS signifie qu'un message a été envoyé à une méthode libérée.

Ici, 'article' n'est pas disponible, n'est-ce pas? Je n'ai aucune erreur relâchant 'item' juste quelques lignes plus bas.

Que se passe-t-il ici? Y at-il une meilleure façon de supprimer "String1" des deux clés?

Merci.

Répondre

0

Ce n'est pas parce que item n'est pas publié, mais item est immuable.

Dans une boucle for-in, l'itérateur traversé ne peut pas être modifié. Si vous le faites, le programme lancera une exception d'énumération mutée.

Vous pouvez

  • rassembler tous obj dans un tableau séparé, puis -removeObjectsForKeys: à la fin de la boucle; ou
  • d'itérer sur une copie des clés des éléments. Plus précisément, for (id obj in [item allKeys]).
+1

Je suis un idiot. Je ne sais pas pourquoi je n'ai pas vu ça. –