2011-02-28 144 views
1

我有这段代码,并试图从嵌套字典中删除一个项目,然后将字典写回到NSUserdefaults。如果我加载一个新的驱动程序,然后回去尝试删除它,程序崩溃。这是我的代码去除。从嵌套字典中删除项目

-(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

对不起,崩溃错误是 - [NSCFDictionary removeObjectForKey:]:发送到不可变对象的变异方法。 – 2011-02-28 19:59:49

+0

在你的代码片段中没有对brandsDict的声明 - 你确定它是一个可变的字典吗?或者你可以像subsDict一样使用mutablecopy吗? – Toastor 2011-02-28 20:14:31

回答

2

您收到的错误消息表示您要修改的字典是NSDictionary,而不是NSMutableDictionary。

您对从NSUserSettings返回的对象调用mutableCopy,该对象确实会创建一个可变字典。但它不会改变任何值。特别是,作为密钥driverBrand的值的字典仍然是不可变的,因为它的密码为driverModel

要做你想在这里做的事情,你必须做一个可变的每个子字典的副本,并将其分配回其父。

另外,顺便说一句,你有额外的保留,将在第一行泄漏内存。它应该是[[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"] mutableCopy] autorelease]