2011-02-28 3 views
1

J'ai ce code et j'essaie de supprimer un élément d'un dictionnaire imbriqué, puis d'écrire le dictionnaire sur NSUserdefaults. Si je charge un nouveau pilote puis revenir en arrière et essayer de le supprimer, le programme se bloque. Voici mon code pour enlever.Suppression d'un élément du dictionnaire imbriqué

-(void)Remove:(id)sender 
{ 
    subsDict = [[[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"]retain] mutableCopy]autorelease]; 
    NSLog(@"%@",modelDict); 
    NSLog(@"Removing Size %@",driverSize); 
    [[[subsDict objectForKey:driverBrand]objectForKey:driverModel]removeObjectForKey:driverSize]; //Crashes here 
    [self updateSizes]; 
    NSLog(@"New sizearray:%i",[sizeArray count]); 

    if ([sizeArray count] == 0) 
    { 
      [brandDict removeObjectForKey: driverModel]; 
     [self updateModels]; 
     NSLog(@"New modelarray count:%i",[modelArray count]); 
     NSLog(@"driver model: %@ Modelarray %@",driverModel, modelArray); 
     if ([modelArray count] == 0) { 
      [subsDict removeObjectForKey:driverBrand]; 

     } 
    } 
    NSLog(@"New subdict:%@",subsDict); 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:subsDict forKey:@"Subs"]; 
    [userDefaults synchronize]; 
} 
+0

Désolé, l'erreur de panne est - [NSCFDictionary removeObjectForKey:]: méthode de mutation envoyée à l'objet immuable. –

+0

Il n'y a pas de déclaration pour brandsDict dans votre extrait de code - êtes-vous sûr qu'il s'agit d'une dictée modifiable ou avez-vous copié la copie comme vous l'avez fait avec subsDict? – Toastor

Répondre

2

Le message d'erreur que vous obtenez indique que le dictionnaire que vous essayez de modifier est un NSDictionary, pas NSMutableDictionary.

Vous appelez mutableCopy sur l'objet renvoyé par NSUserSettings, ce qui en fait un dictionnaire modifiable. Mais cela ne change aucune des valeurs. En particulier, le dictionnaire qui est la valeur pour la clé driverBrand est encore immuable, comme il le dictionnaire à l'intérieur de la clé driverModel. Pour faire ce que vous voulez faire ici, vous devrez faire une copie mutable de chaque sous-dictionnaire en cours de route et l'assigner de nouveau à son parent.

En outre, BTW, vous avez une retenue supplémentaire qui fuit la mémoire dans votre première ligne. Il devrait être [[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"] mutableCopy] autorelease].

Questions connexes