我有这个代码,我试图从嵌套字典中删除一个项目,然后将字典写回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 :(得分:2)
您收到的错误消息表明您尝试修改的字典是NSDictionary,而不是NSMutableDictionary。
你在从NSUserSettings返回的对象上调用mutableCopy
,这确实使它成为一个可变字典。但它并没有改变任何价值观。特别是,作为键driverBrand
的值的字典仍然是不可变的,因为它是键driverModel
内的字典。
要做你想做的事情,你必须在整个过程中制作每个子字典的可变副本并将其分配回其父节点。
另外,BTW,你有一个额外的保留,将在你的第一行泄漏内存。它应该是[[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"] mutableCopy] autorelease]
。