集合 <__NSSetM: 0x14ea0160> 在枚举时发生了突变
Posted
技术标签:
【中文标题】集合 <__NSSetM: 0x14ea0160> 在枚举时发生了突变【英文标题】:Collection <__NSSetM: 0x14ea0160> was mutated while being enumerated 【发布时间】: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
【参考方案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 的代码。 我猜我写的太早了。你当时没有分享你的代码。发生此错误时,您可以分享您的堆栈跟踪吗?以上是关于集合 <__NSSetM: 0x14ea0160> 在枚举时发生了突变的主要内容,如果未能解决你的问题,请参考以下文章
Mapkit 的位置授权不断抛出此错误:(0x14)“无法插入 COPY_SEND”
集合 <__NSArrayM: 0x7fa1f2711910> 在枚举时发生了突变
Presenting view controllers on detached view controllers is discouraged <CallViewController: 0x14