【问题标题】:How do I identify where a "NSArrayM was mutated while being enumerated" is coming from如何确定“NSArrayM 在枚举时发生突变”的来源
【发布时间】:2014-02-17 23:55:01
【问题描述】:

我有时会收到此错误:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 
'*** Collection <__NSArrayM: 0x170057580> was mutated while being enumerated.'

我知道我在使用快速枚举时改变了一个数组,但我不知道如何确定这个问题发生在哪里。堆栈跟踪完全没有向我显示任何内容,除了随机设置断点并猜测直到找到它之外,我无法找到一个很好的方法来确定发生这种情况的位置。

我可以使用某种断点魔法让编译器告诉我发生这种情况的位置吗?或者我可以使用 NSZombies 以某种方式识别它吗?任何帮助将不胜感激。

【问题讨论】:

  • 查看你的代码,你有addObjectremoveObject以及快速枚举块中的类似方法
  • @Merlevede,事情并没有那么简单。我有一个游戏,其中节点在更新循环期间被操纵,这些节点有孩子、孙子等等。很难确定发生这种情况的确切位置。

标签: ios objective-c


【解决方案1】:

查看如何设置异常断点:

https://developer.apple.com/library/ios/recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html

但在最新的 Xcode 中,您只需要执行以下步骤:

在断点导航器的左下角,单击“添加”按钮。

选择添加异常断点。

然后你在断点导航器中得到这个

您的代码现在将在抛出异常而不是在捕获异常时中断。您应该能够导航调用堆栈以查看代码中发生异常的位置。

【讨论】:

  • 我觉得这是我早就应该明白的事情了。不过谢谢你;这正是我想要的。
猜你喜欢
  • 2012-09-21
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2012-07-30
  • 2011-10-04
  • 1970-01-01
  • 2017-08-28
  • 2012-04-26
相关资源
最近更新 更多