在iOS6上使用insertObject:atIndex:的异常

Leo*_*onS 5 exception core-data ios ios6

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

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

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

谢谢

Ali*_*are 19

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

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

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

因此,您可以看到何时使用nil第一个参数的值调用它,并在出现问题时将其解决.

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

异常断点

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


use*_*472 17

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

你可以发布alloced和initialized你试图插入的对象的代码吗?

要查找相关的代码行,请尝试以下操作:转到Xcode项目中的"例外"选项卡:

例外标签

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

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