5

我在 iOS6 上遇到以下异常(在带有 CoreData 的应用程序上):

“2012-10-15 10:21:28.952 MyApp[68650:c07] * 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'* -[__NSArrayM insertObject:atIndex:]: object cannot be nil' *第一次抛出调用堆栈:(0x28e6012 0x2659e7e 0x2899b6a 0x2899a20 0x1646941 0x1642c67 0x164f846 0x164f908 0x6c540 0x2057e83 0x28a5376 0x28a4e06 0x288ca82 0x288bf44 0x288be1b 0x33967e3 0x3396668 0x15a165c 0x13a22 0x2845)的libc ++ abi.dylib:终止称为抛出异常”

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

谢谢你

4

2 回答 2

19

这可能是因为 iOS5 没有为这个错误抛出异常(并且应该有,但现在 iOS6 抛出一个比以后出现不稳定行为更好的异常),或者因为你在 iOS6 中有一些不同的行为,这使得你的对象nil原本是不在iOS5中。

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

  • 转到“断点导航器”视图(Cmd-6快捷方式)
  • 点击“+”按钮添加符号断点 添加符号断点
  • 将符号断点设置为在遇到符号时中断[NSArray insertObject:atIndex:] 编辑符号断点

因此,您可以查看何时使用nil第一个参数的值调用它,并在出现问题的地方解决您的问题。

您还可以添加一个异常断点来在抛出异常时中断,从而知道代码中何时发生异常。这是另一种让您知道代码的哪一部分(您自己的或其他的)生成异常的方法。

异常断点

一旦断点被​​命中并且程序在异常发生之前停止,您可以在调用堆栈中检查您自己的代码的哪一部分导致最后触发了此异常。

于 2012-10-15T09:10:48.800 回答
17

崩溃的原因是您尝试插入的对象是nil. 这意味着它没有正确实例化。这反过来意味着在您遇到该异常之前出现了问题。

您能否发布对您尝试插入的对象进行alloc编辑和初始化的代码?init

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

例外选项卡

然后单击“+”按钮(在页面底部)并选择“Add Exception Breakppoint ...”。将所有设置保留为默认值,然后单击“完成”。

如果你重新运行你的项目,它现在应该在抛出异常之前停止在相关的代码行。然后,您可以向上移动调用堆栈并确定您在代码中从何处调用了负责此行为的库函数。然后尝试查看此时是否所有对象都已正确初始化。

于 2012-10-15T08:35:12.117 回答