-1

昨日「列挙中にコレクションが変更されました」という例外に遭遇し、いくつかの解決策を見ました。オブジェクトの列挙や追加など、操作するときは、最初にロックし、操作後にロックを解除します。それがうまくいくかどうか誰かに教えてもらえますか?

4

3 に答える 3

6

解決しました。問題の 1 つは、スレッド セーフに関するものです。

    @synchronized (yourobject)
    {
    //do something with your object
    }

これは、「yourobject」をロックして、他のスレッドが変更できないようにすることを意味します。次に、「}」の後にロックを解除します

もう 1 つは、配列内のオブジェクトの削除に関するコードです。すぐに削除すると、「列挙中にコレクションが変更されました」という例外が発生します。削除するオブジェクトを含む一時配列を作成し、その後でそれらをすべて削除します。ループ用。

 NSMutableArray *toDestroy = [NSMutableArray arrayWithCapacity:_contactor.count];
    for(Man *sprite in self.contactor)
    {
        if (sprite.hp<=0 && sprite.stat == stat_attack)
        {
            [sprite stopAllActions];
            [sprite animDead];
            [toDestroy addObject:sprite];
        }
    }
    [self.contactor removeObjectsInArray:toDestroy];

それ以外の

for(Man *sprite in self.contactor)
{
    if (sprite.hp<=0 && sprite.stat == stat_attack)
    {
        [sprite stopAllActions];
        [sprite animDead];
        [self.contactor removeObject:sprite];
    }
}
于 2012-05-03T03:08:44.007 に答える
3

コピーするだけです。配列の場合は、次のようにします。

NSArray *arrayToEnumerate = [myMutableArray copy];

ここで列挙すると、変更不可能な配列が自分の下で変更されることを心配する必要はありません。

于 2012-05-02T03:18:12.463 に答える
0

列挙中に配列を変更することはできません。回避策として、新しいオブジェクトを一時配列に蓄積し、列挙後に追加する必要があります。

NSArray *tempArray = [yourArray copy];

for(id obj in tempArray) {
    //It's safe to remove objects from yourArray here.

}
[tempArray release];
于 2012-12-01T17:14:11.817 に答える