微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决迭代时从 NSMutableArray 中删除的最佳方法?

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

NSMutableArray *discardedItems = [NSMutableArray array];

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

[originalArrayOfItems removeObjectsInArray:discardedItems];

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

编辑添加

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

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

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

解决方法

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

谢谢,

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

iterator it = someList.begin();

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。