【问题标题】:<__NSCFDictionary: 0x1557f400> was mutated while being enumerated.'<__NSCFDictionary: 0x1557f400> 在枚举时发生了变异。
【发布时间】:2015-10-26 04:15:56
【问题描述】:

我有一个在 iphone 4 上运行的 ios 7 应用程序。我有一个奇怪的问题,由于标题中的错误,应用程序在 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"]];
            }
        }
    }

【问题讨论】:

  • checkBadgeCondition 内部发生了什么?此外,您可能希望转换为 Objective-C 2.0 语法。即,[tempBadge setObject:@"YES" forKey:@"archived"] 可以简化为 tempBage[@"archived"] = @"YES"。

标签: ios objective-c


【解决方案1】:
newBadges = badges

这不是副本,它只是对同一事物的另一个引用。您还应该期望来自用户默认值的字典(或数组)是可变的。所以,在这里制作一个可变副本

newBadges = [badges mutableCopy]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2017-11-22
    • 2015-02-01
    • 2014-02-15
    • 2013-01-29
    • 2017-08-15
    相关资源
    最近更新 更多