Изменение коллекции, которую вы повторяете, иногда трудно понять.Есть веские причины избегать этого, даже в вашем случае есть простое решение.(Но эти решения очень быстро ломаются, когда вы удаляете другие элементы массива.)
Существует несколько общих решений:
A.Перебрать копию
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", nil];
NSArray *iterationArray = [array copy];
[iterationArray enumerateObjectsWithOptions: NSEnumerationReverse usingBlock:
^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"A"]) {
[array removeObject:obj];
} else if ([obj isEqualToString:@"B"]) {
[array removeObject:obj];
}
}];
B.Хранить объекты для удаления
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", nil];
NSMutableArray *itemsToRemove = [NSMutableArray new];
[array enumerateObjectsWithOptions: NSEnumerationReverse usingBlock:
^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"A"]) {
[itemsToRemove addObject:obj];
} else if ([obj isEqualToString:@"B"]) {
[itemsToRemove addObject:obj];
}
}];
[array remveObjects:itemsToRemove];
Все эти способы сделать это , включая ваш путь , могут привести к неожиданным результатам, поскольку -removeObject:
удаляет все вхождения объекта всам массив, что означает удаление всех объектов, которые равны аргументу, включая объекты, которые не идентичны.
C.Удаление объектов с этими индексами
Если вы выполняете итерацию с использованием индекса - или можете легко построить индекс - более эффективно сохранить индексы, а затем удалить с этим.Это дает вам возможность различаться между одинаковыми и одинаковыми объектами.В вашем случае
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", nil];
NSMutableIndexSet *itemsToRemove = [NSMutableIndexSet new];
__block NSUInteger index=0;
[array enumerateObjectsWithOptions: NSEnumerationReverse usingBlock:
^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
{
if ([obj isEqualToString:@"A"])
{
[itemsToRemove addIndex:index];
} else if ([obj isEqualToString:@"B"]) {
[itemsToRemove addIndex:index];
}
index++;
}];
[array removeObjectsAtIndexes:itemsToRemove];
NSLog(@"%@", array);