答えて

12

いいえ、ループの高速列挙中に配列を変更するとエラーになります。配列のコピーを作成し、それを反復処理して元の配列から削除します。

NSArray *itemsCopy = [items copy]; 

for (id item in itemsCopy) { 
    if ([item customCheck]) 
     [items removeObject:item]; // Is this ok here 
} 

[itemsCopy release]; 
+0

。 –

+0

いいえ、この例ではインデックスを使用してアイテムをディスプレイから削除しません。 NSMutableArrayのremoveObject:メソッドは配列を調べ、見つかったオブジェクトへの最初の参照を削除します。内部的には、呼び出しはindexOfObject:およびremoveObjectAtIndex:を使用して行います。十分な大きさの配列があれば、これはパフォーマンスが低下する可能性があります。あなたはインデックスを追跡することによってそれを少し最適化することができますが、削除のために調整する必要があります。 – McCygnus

3

Nope:

列挙を使用すると、列挙中にコレクションを変更しようとすると、例外が発生するように、「安全」-the列挙子は、突然変異ガードを持っています。配列をコピーして列挙するか、ループの後に使用インデックスセットを構築いずれか:あなたはUsing Enumeratorsに記載されているを列挙したいアレイを変更するための

オプション。

+0

ありがとう - McCygnusからの提案はこれに従うように見えるので、それはokに見えます – Greg

0

あなたは次のように削除できます。削除が発生したときに、各配列要素が1ずつシフトされますので、これは1つの要素をスキップしないでしょう

//Create array 
    NSMutableArray* myArray = [[NSMutableArray alloc] init]; 

    //Add some elements 
    for (int i = 0; i < 10; i++) { 
     [myArray addObject:[NSString stringWithFormat:@"i = %i", i]]; 
    } 

    //Remove some elements =} 
    for (int i = (int)myArray.count - 1; i >= 0 ; i--) { 
     if(YES){ 
      [myArray removeObjectAtIndex:i]; 
     } 
    } 
+0

それは私がdiferenceを作ります。 ;) – user3761851

関連する問題