【问题标题】:Removing object from NSMutableArray从 NSMutableArray 中删除对象
【发布时间】:2011-02-14 23:15:42
【问题描述】:

我在设置 for 循环时偶然发现了以下快捷方式(与我一直使用的教科书示例相比的快捷方式):

for (Item *i in items){ ... }

相对于较长的格式:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right

如果我使用的是较短的版本,有没有办法删除当前正在迭代的项目(即“i”)?还是我需要使用更长的格式?

【问题讨论】:

  • 第一个 for 循环称为增强型 FOR 循环,第二个是旧的标准 FOR 循环。我在进行 Java 认证时了解到这一点。
  • 如果您确实需要在迭代时从数组中删除项目,并且之后无法像 @Vladimir 建议的那样使用 removeObjectsInArray:removeObjectsAtIndexes: 删除它们,您可以随时迭代原始数组。

标签: objective-c cocoa nsmutablearray


【解决方案1】:

fast-enumerating它时你不能从数组中删除对象:

枚举是“安全的”——枚举数 有一个突变守卫,所以如果你 尝试修改集合 在枚举期间,一个例外是 提出来。

无论如何,为什么在枚举容器时需要更改容器?考虑存储需要删除的元素,并使用removeObjectsInArray:removeObjectsAtIndexes: 方法将它们从容器中移除。

【讨论】:

  • 谢谢。我在枚举它时更改它,因为它是一个临时队列。我正在将所有项目移动到另一个数组。
  • 如果您要将 所有 对象移动到另一个数组,请尝试以下操作:[destinationArray addObjectsFromArray: sourceArray]; [sourceArray removeAllObjects];
  • 很好的答案!像魅力一样工作!
【解决方案2】:

删除项目后只需添加关键字break;...

for(id item in items) {
    if([item isEqual:itemToDelete]) {
        [items removeObject:item];
        break; // A very important line ?
    }
}

【讨论】:

  • @Abdullah71 的 id 你从不使用 *.
  • 这将删除一个对象并停止迭代,从而丢失可能应该删除的其他对象。因此,只有在每次迭代需要删除零到一个对象时才使用它。
【解决方案3】:

在枚举期间不得修改 Objective-C 集合。

您可以使用此变体从集合中删除对象:

for (NSInteger i = items.count - 1; i >= 0 ; i--) {
   [items removeObjectAtIndex:i];
}

【讨论】:

  • 恕我直言,这是正确执行此操作的最短方法,因为您的业务逻辑可以从后到前遍历数组。
【解决方案4】:

前一个循环是 Objective C 中的“for-each”循环。

*i 是指向 items-Array 中直接项的指针(大多数情况下这将是 NSMutableArray)。

这样就可以直接对item进行操作了:

[items removeObject: i];

这(应该)工作 - 我目前没有在我的 Mac 上工作,也无法检查它。 然而,Objective-C 可能会在迭代集合时阻止删除对象(这在大多数语言中很常见)。

【讨论】:

  • 在枚举NSMutableArray 时确实不能删除(或变异)它,因此removeObject: 调用会引发异常。 (正如弗拉基米尔在他的回答中所解释的那样)
【解决方案5】:

我为此使用此代码:

for (NSUInteger i = [items count] - 1; ; i--) {
     [items removeObjectAtIndex:i];
}

【讨论】:

  • 直到我得到-1...然后它崩溃:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多