【问题标题】:Collection <__NSSetM: 0x14ea0160> was mutated while being enumerated集合 <__NSSetM: 0x14ea0160> 在枚举时发生了突变
【发布时间】:2015-06-12 02:51:29
【问题描述】:

当我使用 UICollectionView 时。我需要更改它的 dataArray 和 reloadData。但是当我删除dataArray中的一个对象时,我写了代码[collectionView reloadData];,我滑动collectionView然后错误来了,告诉我 *由于未捕获的异常'NSGenericException'而终止应用程序,原因: '* 集合 <__nssetm:> 在枚举时发生了变异。'我该如何解决这个问题?非常感谢!!!

NSMutableArray *temp = [NSMutableArray arrayWithArray:self.dataArray]; 
for (Mysource *source in self.dataArray) { 
    if (source.isSelect) { 
        [temp removeObject:source]; 
    } 
} 
self.dataArray = [NSMutableArray arrayWithArray:temp]; 
[self.CollectionView reloadData];

【问题讨论】:

  • 您需要出示您的代码,否则没有人可以帮助您。
  • NSMutableArray *temp = [NSMutableArray arrayWithArray:self.dataArray]; for (Mysource *source in self.dataArray) { if (source.isSelect) { [temp removeObject:source]; } } self.dataArray = [NSMutableArray arrayWithArray:temp]; [self.CollectionView reloadData];
  • 它不会立即崩溃,当我这样做时,然后我滑动 CollectionView ,它会崩溃
  • 这不是导致问题的代码。错误消息显示 NSMutableSet 正在发生变异。这就是NSSetM 所表示的。你需要去别处看看。首先,确保这发生在主线程上,因为所有 UI 调用都必须发生在主线程上,其中包括 UICollectionView.reloadData

标签: ios


【解决方案1】:

我相信,当您枚举某个集合(可能是一个循环)时,您正在从循环内的该集合中删除一个对象。类似于以下内容:

for (id object in someArray)
   if (conditionSatisfied)
       [someArray removeObject:object];

这在 Objective-C 中是不允许的。您需要将需要删除的对象存储在临时集合中,然后在循环结束后将其删除。

【讨论】:

  • 但是我已经复制了dataArray,在for in中,我没有更改dataArray,我只是更改了temp。当我这样做时,它不会立即崩溃。我滑动 CollectionView ,它会崩溃。
  • 正如 Ewan Mellor 所指出的,您显示的代码不是发生异常的地方,因为它没有 NSMutableSet - 在 Xcode 中设置异常断点并查看崩溃的实际位置发生
  • 谢谢,我已经设置了所有例外,但它在 appDelegate 中中断。而且我还没有写任何关于 NSMutableSet 的代码。
  • 我猜我写的太早了。你当时没有分享你的代码。发生此错误时,您可以分享您的堆栈跟踪吗?
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多