insertObject:atIndex:iOS6上的exception

我在iOS6上获得以下exception(在具有CoreData的应用程序上):

“2012-10-15 10:21:28.952 MyApp [68650:c07] *终止应用程序由于未捕获的exception'NSInvalidArgumentException',原因:'* – [__ NSArrayM insertObject:atIndex:]:对象不能为零*堆栈:(0x28e6012 0x2659e7e 0x2899b6a 0x2899a20 0x1646941 0x1642c67 0x164f846 0x164f908 0x6c540 0x2057e83 0x28a5376 0x28a4e06 0x288ca82 0x288bf44 0x288be1b 0x33967e3 0x3396668 0x15a165c 0x13a22 0x2845)libc ++ abi.dylib:terminate调用抛出exception“

这在iOS5上不会发生,所以iOS6上发生了一些我不明白的事情。 我在每一个我调用insertObject:atIndex的地方设置一个断点:但是这些不被调用 – 它必须是在这个libc ++ abi.dylib中被调用和崩溃的东西。 有谁知道什么可能是错的?

谢谢

崩溃的原因是你试图插入的对象是nil 。 这意味着它没有正确实例化。 这反过来意味着你在达到这个例外之前出了问题。

你可以发布代码, allocinit你试图插入的对象吗?

为了find相关的代码行,请尝试以下操作:转到Xcode项目中的“Exception”选项卡:

例外选项卡

然后点击“+”button(在页面底部)并select“添加exception断点…”。 将所有设置保留为默认值,然后单击“完成”。

如果您重新运行您的项目,现在应该停止在引发exception之前的相关代码行。 然后,您可以向上移动调用堆栈,并从代码中的哪个位置调用负责此行为的库函数。 然后尝试看看是否所有的对象在这一点上正确初始化。

这可能是因为iOS5没有为这个错误抛出一个exception(而且应该有,但是现在iOS6抛出一个比稍后有错误行为的更好),或者因为你在iOS6中有一些不同的行为,使得你的对象nil而它不在iOS5中。

不pipe什么原因,你可以在insertObject:atIndex: symbol上添加一个符号断点,这样每次调用这个方法时,它都会中断,无论它在你的应用程序中(在你自己的代码中)。

  • 转到“断点导航器”视图( Cmd-6快捷键)
  • 点击“+”button添加一个符号断点 添加符号断点
  • 将符号断点设置为符号断点[NSArray insertObject:atIndex:] 编辑符号断点

因此,您可以看到何时调用第一个参数的nil值,并在发生问题的位置解决问题。

你也可以添加一个exception断点来抛出exception,从而知道exception发生的时间。 这是另一种让你知道代码的哪一部分(你自己或另一个)产生exception的方法。

异常断点

一旦断点被​​触发,程序在发生exception之前就停止,你可以检查调用堆栈中你自己代码的哪一部分导致触发这个exception。