for (id object in array.reverseObjectEnumerator) {
// objectを削除する必要があるかどうかチェックする
if ([object shoudRemove]) {
// objectを削除する
[array removeObject:object];
}
}
というコードを見かけたのですが、これはちょっとどうなのかな?
と思いました。
なぜならremoveObjectが配列では定数時間ではないからです。
コードでは1重ループのはずが、内部的には2重ループをまわしていることになるのです。
NSArrayにはfilteredArrayUsingPredicate、
NSMutableArrayにはfilterUsingPredicateが使えるので、こちらを使うのが良いんじゃないかと思います。
コレクションのサイズが大きくなると、この速度差は歴然だと思います。
実装によっては深刻なボトルネックにもなりかねません。
※もちろん要素数が少ないならばどっちでもいいです。
NSPredicateではblocksを使ってやるのが一番使いやすいかなとおもいます。
NSMutableArray *array = [@[@1, @2, @3, @4, @5] mutableCopy];
[array filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSNumber *evaluatedObject, NSDictionary *bindings) {
return evaluatedObject.intValue > 2;
}]];
NSLog(@"%@", array);