Objective-C for
のループで、ループしているアイテムを副作用なしで削除できますか?forループ内の項目を副作用なしで削除しますか?
たとえば、これは問題ありませんか?
for (id item in items) {
if ([item customCheck]) {
[items removeObject:item]; // Is this ok here?
}
Objective-C for
のループで、ループしているアイテムを副作用なしで削除できますか?forループ内の項目を副作用なしで削除しますか?
たとえば、これは問題ありませんか?
for (id item in items) {
if ([item customCheck]) {
[items removeObject:item]; // Is this ok here?
}
いいえ、ループの高速列挙中に配列を変更するとエラーになります。配列のコピーを作成し、それを反復処理して元の配列から削除します。
NSArray *itemsCopy = [items copy];
for (id item in itemsCopy) {
if ([item customCheck])
[items removeObject:item]; // Is this ok here
}
[itemsCopy release];
列挙を使用すると、列挙中にコレクションを変更しようとすると、例外が発生するように、「安全」-the列挙子は、突然変異ガードを持っています。配列をコピーして列挙するか、ループの後に使用インデックスセットを構築いずれか:あなたはUsing Enumeratorsに記載されているを列挙したいアレイを変更するための
オプション。
ありがとう - McCygnusからの提案はこれに従うように見えるので、それはokに見えます – Greg
あなたは次のように削除できます。削除が発生したときに、各配列要素が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];
}
}
それは私がdiferenceを作ります。 ;) – user3761851
。 –
いいえ、この例ではインデックスを使用してアイテムをディスプレイから削除しません。 NSMutableArrayのremoveObject:メソッドは配列を調べ、見つかったオブジェクトへの最初の参照を削除します。内部的には、呼び出しはindexOfObject:およびremoveObjectAtIndex:を使用して行います。十分な大きさの配列があれば、これはパフォーマンスが低下する可能性があります。あなたはインデックスを追跡することによってそれを少し最適化することができますが、削除のために調整する必要があります。 – McCygnus