【问题标题】:removeObject in ios [duplicate]ios中的removeObject [重复]
【发布时间】:2015-06-19 12:45:06
【问题描述】:

我的程序有一个名为“matchedCards”的 NSMutable 数组,我在其中添加了几个 Card 类型的对象,现在我需要从数组中删除对象,我使用以下代码:

for (Card * removeCards in matchedCards)
  {
    [self.matchedCards removeObject:removeCards];
  }

第一个卡片对象被删除,然后程序崩溃,谁能解释它背后的原因,如果成功删除第一个对象,为什么它从第二个对象开始抛出错误

【问题讨论】:

  • 您的matchedCards 数组正在动态删除它的对象...并且您正在循环通过matchedCards 数组,每次您从中删除一个对象后,它的项目计数都会改变。

标签: ios objective-c


【解决方案1】:

您不能在快速枚举数组时从数组中删除元素。
如果您只是想删除所有对象,请执行

[self.matchedCards removeAllObjects];

如果您只想删除某些元素,请记住它们在 IndexSet 中的索引并删除那些

NSMutableIndexSet* indexesToRemove = [NSMutableIndexSet new];
for (NSUInteger index = 0; index < [self.matchedCards count]; ++index)  {
    if (whatever) {
        [indexesToRemove addObject:index];
    }
}


[self.matchedCards removeObjectsAtIndexes:indexesToRemove];

【讨论】:

  • 我不同意You can't update an array while traversing it.,我的回答证明这个说法是错误的..
  • @0yeoj 我认为这有点暗示我的意思,但你是对的,我应该更清楚,澄清我的答案
  • 没关系,我只是想把事情弄清楚,避免混乱。干杯,兄弟。 :)
【解决方案2】:

在对数组进行迭代时,您不能从数组中删除对象。改为这样做:

for (Card * removeCards in [matchedCards copy])
{
    [self.matchedCards removeObject:removeCards];
}

【讨论】:

  • 这应该被接受。
  • @SteveMadsen 这不是 OP 想要做的吗?
  • 是的。我的评论是对另一条已被删除的评论的回复。我现在将删除我原来的评论(没有任何意义)并尽快删除。
【解决方案3】:

阅读崩溃日志。它会说...

“在枚举时声明了集合”

或者类似的东西。

您不能在使用for:in 循环迭代数组时对其进行变异。

你可以这样做......

[matchedCards enumerateObjectsUsingBlock:^(Card *removedCards, NSInteger idx, BOOL *stop) {
    [self.matchedCards removeObject:card];
}];

此外,使用您当前的代码,您实际上是从matchedCards 数组中删除所有对象。它将导致一个空数组。你确定这就是你想要的吗?

【讨论】:

    【解决方案4】:

    原因是因为您正在删除当前对象并破坏for-statement

    这里有一个解决方案:

    for (int i = 0; i < self.matchedCards.count; i++)
    {
        if ([self.matchedCards[i] isKindOfClass:[YourClass class]])
        {
            [self.matchedCards removeObject:self.matchedCards[i]];
    
            i--; // invalidate the removed index
        }
    }
    NSLog(@"%@", self.matchedCards);
    

    请注意i-- 很重要,否则您将无法到达数组的最后一个元素..

    希望这对您有所帮助.. 干杯..

    【讨论】:

      【解决方案5】:
      // if remove all objects
      [matchedCards removeAllObjects];
      
      // if you want to remove using index
      for (int i =[matchedCards count]-1; i>=0; i++) {
         if (condition) {
             [matchedCards removeObjectAtIndex:i];
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多