Pour plus de clarté, j'aime faire une boucle initiale où je collecte les éléments à supprimer. Ensuite, je les supprime. Voici un exemple utilisant la syntaxe Objective-C 2.0:
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
Ensuite, il n'est pas question de savoir si les indices sont mis à jour correctement ou d'autres petits détails de comptabilité.
Modifié pour ajouter:
Il a été noté dans d'autres réponses que la formulation inverse devrait être plus rapide. c'est-à-dire si vous parcourez le tableau et composez un nouveau tableau d'objets à conserver, au lieu d'objets à jeter. Cela peut être vrai (mais qu'en est-il du coût de mémoire et de traitement pour allouer un nouveau tableau et éliminer l'ancien?), Mais même s'il est plus rapide, ce n'est peut-être pas aussi grave que pour une implémentation naïve, car NSArrays ne se comportent pas comme des tableaux "normaux". Ils parlent mais ils marchent différemment. Voir une bonne analyse ici:
La formulation inverse peut être plus rapide, mais je n'ai jamais eu besoin de m'en soucier, car la formulation ci-dessus a toujours été assez rapide pour mes besoins.
Pour moi, le message à retenir est d'utiliser la formulation la plus claire pour vous. Optimisez uniquement si nécessaire. Personnellement, je trouve la formulation ci-dessus la plus claire, c'est pourquoi je l'utilise. Mais si la formulation inverse est plus claire pour vous, allez-y.