如何解决迭代时从 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 举报,一经查实,本站将立刻删除。