1

配列のオブジェクトを時々削除する必要がありますが、そうするとこのエラーが発生します。

コレクション < CALayerArray: 0xc4f3b20> が列挙中に変更されました

エラーは、配列のアクセサーであるこのメソッドに表示されます。

- (NSArray *)occupantsArray
{
    if (dispatch_get_current_queue() == moduleQueue)
    {
        return occupantsArray;
    }
    else
    {
        __block NSArray *result;

        dispatch_sync(moduleQueue, ^{ //ON THIS LINE
            result = [occupantsArray copy];
        });

        return [result autorelease];
    }
}

ご覧のとおり、元の配列ではなくコピーを返すように注意していますが、それでもクラッシュします。

また、配列の要素を削除する方法はこれです。

- (void)eraseJIDFromArray:(NSString*)jid{

    dispatch_block_t block = ^{
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        int i = 0;
        for(NSString *jidAct in occupantsArray){
            if([jidAct isEqualToString:jid]){
                [occupantsArray removeObjectAtIndex:i];
            }
            i++;
        }
        [pool drain];
    };

    if (dispatch_get_current_queue() == moduleQueue)
        block();
    else
        dispatch_async(moduleQueue, block);



}

配列には最大 200 個の要素を含めることができるため、すべての要素を処理するには時間がかかる場合がありますが、キューを設定しているため、他に何ができるかわかりません。

何か案は?

ありがとう。

4

1 に答える 1

4

このコード:

for(NSString *jidAct in occupantsArray){
    if([jidAct isEqualToString:jid]){
        [occupantsArray removeObjectAtIndex:i];
    }
    i++;
}

おそらくあなたの問題を引き起こしています。配列の列挙中に要素を削除しないでください。これを回避するには、NSMutableIndexSet を使用します。

NSMutableIndexSet *indexes = [NSMutableIndexSet set]; // assuming NSInteger i;
for(NSString *jidAct in occupantsArray){
    if([jidAct isEqualToString:jid]){
        [indexes addIndex:i];
    }
    i++;
}
[occupantsArray removeObjectsAtIndexes:indexes];
于 2012-04-24T08:36:38.560 に答える