2

我在更新 NSMutableDictionary 值时遇到了一个奇怪的问题。我正在运行一个 for-in 循环,一切都很好,我的数学很好。

当我尝试使用该setValue: forKey:方法更新我的字典时,问题就出现了。

for(NSString *key in self.planetDictionary){
         if(![key isEqualToString:planet]){ 

             * * *
            //do some math and stuff, create an NSNumber:
             NSNumber *update = [NSNumber numberWithFloat:updatedProbability];

             //Problem code, EXC_BAD_ACCESS here:
             [self.planetDictionary setValue:update forKey:key];
        }
    }

我得到 EXC_BAD_ACCESS 崩溃。我可以确认其他一切都很好,它只是我尝试更新值的单行。

这是怎么回事?谢谢

4

3 回答 3

8

你不能改变你正在快速枚举的对象。每次都会崩溃。作为一种解决方法,您可以先制作一个副本:

NSDictionary *dictionary = [self.planetDictionary copy];

for (NSString *key in dictionary) {
     if (![key isEqualToString:planet]) {              
         NSNumber *update = [NSNumber numberWithFloat:updatedProbability];
         [self.planetDictionary setValue:update forKey:key];
    }
}

或者,如果您的字典中有大对象(符合NSCopying,否则它只是一个浅拷贝并且不会很重要),因此您不想复制所有对象,那么您可以简单地复制键(作为数组)并像这样枚举它们:

NSArray *keysCopy = [[self.planetDictionary allKeys] copy];

for (NSString *key in keysCopy) {
    if (![key isEqualToString:planet]) { 
        NSNumber *update = [NSNumber numberWithFloat:updatedProbability];
        [self.planetDictionary setValue:update forKey:key];
    }
}
于 2013-04-08T21:18:18.270 回答
2

看起来你在枚举它时正在改变它。

循环时不能更改 NSDictionary。

您可能希望在循环之前对其进行复制,并在更改原始文件时枚举该副本。

于 2013-04-08T21:13:38.910 回答
2

在 for 循环中使用它时不能更新它。使用字典键的副本在 for 循环中使用并更新 for 循环内的原始键。

于 2013-04-08T21:16:35.160 回答