Ios <__NSCFDictionary:0x1557f400>;在被枚举时发生了变异;

Ios <__NSCFDictionary:0x1557f400>;在被枚举时发生了变异;,ios,objective-c,Ios,Objective C,我有一个iOS7应用程序,运行在iPhone4上。我有一个奇怪的问题,由于标题中的错误,应用程序在for循环内部崩溃。我勾选了SO,它说当您更改正在迭代的对象时会发生错误。 所以我把两个变量都复制到了临时变量中,但问题仍然存在。 问题发生在第一次迭代完成时 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary * badges = [defaults objectForK

我有一个iOS7应用程序,运行在iPhone4上。我有一个奇怪的问题,由于标题中的错误,应用程序在for循环内部崩溃。我勾选了SO,它说当您更改正在迭代的对象时会发生错误。 所以我把两个变量都复制到了临时变量中,但问题仍然存在。 问题发生在第一次迭代完成时

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary * badges = [defaults objectForKey:@"badges"];
    NSMutableDictionary *newBadges = badges;
    for(NSString* key in badges)
    {
        NSDictionary* badge = [badges objectForKey:key];
        if([[badge objectForKey:@"achived"]  isEqual: @"NO"])
        {
            if([self checkBadgeCondition:badge])
            {
                NSMutableDictionary *tempBadge = [badge mutableCopy];
                [self showAlertBadge:badge];
                [tempBadge setObject:@"YES" forKey:@"achived"];
                [newBadges setObject:tempBadge forKey:[tempBadge objectForKey:@"name"]];
            }
        }
    }
这不是复制品,只是对同一事物的另一个引用。您还应该期望来自用户默认值的字典(或数组)是可变的。所以,在这里制作一个可变副本

newBadges = [badges mutableCopy]

checkBadgeCondition
内部发生了什么?此外,您可能希望转换为Objective-C2.0语法。也就是说,
[tempBage setObject:@“YES”forKey:@“archived”]
可以简化为
tempBage[@“archived”]=@“YES”
newBadges = [badges mutableCopy]