小编典典

迭代时从 NSMutableArray 中删除的最佳方法?

all

在 Cocoa 中,如果我想遍历 NSMutableArray 并删除符合特定条件的多个对象,那么在每次删除对象时不重新启动循环的最佳方法是什么?

谢谢,

编辑:只是为了澄清-我正在寻找最好的方法,例如比手动更新我所在的索引更优雅的方法。例如在 C++ 中我可以做到;

iterator it = someList.begin();

while (it != someList.end())
{
    if (shouldRemove(it))   
        it = someList.erase(it);
}

阅读 142

收藏
2022-07-08

共1个答案

小编典典

为了清楚起见,我喜欢创建一个初始循环,在其中收集要删除的项目。然后我删除它们。这是一个使用 Objective-C 2.0 语法的示例:

NSMutableArray *discardedItems = [NSMutableArray array];

for (SomeObjectClass *item in originalArrayOfItems) {
    if ([item shouldBeDiscarded])
        [discardedItems addObject:item];
}

[originalArrayOfItems removeObjectsInArray:discardedItems];

那么就没有问题是否正确更新了索引或其他小的簿记细节。

编辑添加:

在其他答案中已经指出,逆公式应该更快。即,如果您遍历数组并组成一个新的对象数组来保留,而不是要丢弃的对象。这可能是真的(尽管分配新数组并丢弃旧数组的内存和处理成本如何?)但即使它更快,它也可能不像幼稚的实现那样重要,因为
NSArrays不要表现得像“正常”数组。他们谈论谈话,但他们走的是不同的路。在这里看到一个很好的分析:

逆公式可能更快,但我从来不需要关心它是否是,因为上面的公式总是足够快以满足我的需要。

对我来说,带回家的信息是使用你最清楚的任何表述。仅在必要时进行优化。我个人觉得上面的公式最清楚,这就是我使用它的原因。但是,如果逆公式对您来说更清楚,那就去吧。

2022-07-08