hachinoBlog

hachinobuのエンジニアライフ

配列の走査中にデータを消すとでるエラー Collection was mutated while being enumerated.

配列の走査中に格納されているデータを消すと[Collection was mutated while being enumerated.]というエラーでアプリが落ちた。

NSMutableArray *array = @[@"a", @"b", @"c", @"d"];

for (NSString str in array) {
    if ([str isEqualToString:@"b"]) {
        [array removeObject:str]; //Collection was mutated while being enumerated. エラー発生
    }
}

列挙子を用いてアクセスしている最中に、配列の中身を変更するなということみたい。
解決法としては配列の後ろから走査するreverseObjectEnumeratorを使えば良い

NSMutableArray *array = @[@"a", @"b", @"c", @"d"];

for (NSString str in [array reverseObjectEnumerator]) {
    if ([str isEqualToString:@"b"]) {
        [array removeObject:str]; //成功
    }
}

配列の後ろから走査することで既に走査済みのデータが消されたところで問題ないため。

参考URL
http://news.mynavi.jp/column/objc/105/index.html