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 クラッシュが発生します。値を更新しようとする 1 行だけです。

どうしたの?ありがとう

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 に答える