Для наочності я люблю робити початковий цикл, де я збираю елементи, які потрібно видалити. Потім я видаляю їх. Ось зразок із використанням синтаксису Objective-C 2.0:
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
Тоді не виникає сумнівів у тому, чи правильно оновлюються індекси, чи інші дрібні дані бухгалтерії.
Відредаговано, щоб додати:
В інших відповідях зазначалося, що зворотна формулювання повинна бути швидшою. тобто якщо ви повторюєте масив і складаєте новий масив об'єктів, який потрібно зберігати, а не об'єкти для відкидання. Це може бути правдою (хоча як щодо витрат на пам'ять та обробку на виділення нового масиву та відмову від старого?), Але навіть якщо це швидше, це може бути не настільки великою справою, як це було б для наївної реалізації, тому що NSArrays не поводяться як "нормальні" масиви. Вони говорять на розмову, але вони ходять іншою прогулянкою. Дивіться хороший аналіз тут:
Зворотна рецептура може бути швидшою, але мені ніколи не потрібно було дбати, чи є вона, тому що вищевказана рецептура завжди була досить швидкою для моїх потреб.
Для мене повідомлення з дому - використовувати будь-який склад, який вам найбільш зрозумілий. Оптимізуйте лише за потреби. Особисто я вважаю, що вищевказана рецептура є найяснішою, саме тому я її використовую. Але якщо зворотна формулювання вам зрозуміліша, ідіть до цього.