iphone - 无法从 for-in 循环中更新 NSMutableDictionary 值?

标签 iphone ios objective-c ipad

我在更新 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 崩溃。我可以确认其他一切都很好,它只是我尝试更新值的一行。

这是怎么回事?谢谢

最佳答案

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

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];
    }
}

关于iphone - 无法从 for-in 循环中更新 NSMutableDictionary 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15889047/

相关文章:

ios - 为什么 iPhone 7 和 iPhone 7 Plus 屏幕截图会发送与 RGB 色彩空间图像不兼容的 alpha?

iphone - iOS 5 中无效的 MKMapView 区域

ios - 使用 swift 和 flutter 集成 Stripe SDK

android - 从 Apple Store 安装的应用程序会自动创建主屏幕快捷方式图标吗?

ios - 将 `NSMutableArray` 的实例添加到 `NSArray` 对象中

iphone - .NIB -> .XIB 怎么了?

objective-c - 解密Cocoa中的RSA公钥

iphone - 扭曲的导航栏自定义后退按钮

iphone - 动画自定义 UIView

iPhone 缓存问题