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

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

谢谢,

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

iterator it = someList.begin();

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

最佳答案

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

NSMutableArray *discardedItems = [NSMutableArray array];

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

[originalArrayOfItems removeObjectsInArray:discardedItems];

那么,关于索引是否被正确更新,或其他小簿记细节就毫无疑问了。

编辑添加:

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

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

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

https://stackoverflow.com/questions/111866/

相关文章:

ios - Xcode下架构x86_64的重复符号

iphone - 接收者类型 *** 例如消息是前向声明

objective-c - Xcode 4.4 发行说明中提到的 "Objective-C Lite

objective-c - 洗牌 NSMutableArray 的最佳方法是什么?

objective-c - 为什么 ARC 仍然需要 @autoreleasepool?

ios - 在代码中为 UIButton 设置图像

ios - 从父 iOS 访问容器 View Controller

ios - 缩放 MKMapView 以适应注释图钉?

objective-c - respondsToSelector 的 Swift 等价物是什么?

ios - 使用 iOS 将文本复制到剪贴板