Iphone 从嵌套字典中删除项

Iphone 从嵌套字典中删除项,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我有这段代码,正在尝试从嵌套字典中删除一项,然后将字典写回NSUserdefaults。如果我加载了一个新的驱动程序,然后返回并尝试删除它,程序就会崩溃。这是我删除的代码 -(void)Remove:(id)sender { subsDict = [[[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"]retain] mutableCopy]autorelease]; NSLog(@"%@",modelDict

我有这段代码,正在尝试从嵌套字典中删除一项,然后将字典写回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];
}

您收到的错误消息表明您试图修改的词典是NSDictionary,而不是NSMutableDictionary

您可以对从NSUserSettings返回的对象调用
mutableCopy
,这将使其成为一个可变字典。但它不会改变任何值。特别是,作为键
driverBrand
的值的字典仍然是不可变的,因为它是键
driverModel
的字典

要在这里完成您想要做的事情,您必须在过程中为每个子字典创建一个可变副本,并将其分配回其父字典


另外,顺便说一句,您还有一个额外的retain,它将在您的第一行中泄漏内存。它应该是
[[[[NSUserDefaults standardUserDefaults]objectForKey:@“Subs”]mutableCopy]autorelease]

对不起,崩溃错误是-[NSCFDictionary removeObjectForKey:]:mutating方法发送到immutable对象。您的代码段中没有brandsDict的声明-您确定这是一个可变dict,还是像使用SubDict一样进行可变复制?