Iphone 从嵌套字典中删除项
我有这段代码,正在尝试从嵌套字典中删除一项,然后将字典写回NSUserdefaults。如果我加载了一个新的驱动程序,然后返回并尝试删除它,程序就会崩溃。这是我删除的代码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
-(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一样进行可变复制?