NSArray:为什么发送SIGABRT而不是'index out of bounds'这样的错误?

时间:2012-04-13 12:52:20

标签: objective-c xcode nsarray sigabrt

确定。所以我在一个复杂的Objective-C iOS程序上遇到了这个非常奇怪的SIGABRT错误,经过一天的跟踪后我找到了罪魁祸首。

假设我们有以下代码:

NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSLog(@"tada: %@", [a objectAtIndex:-1]);

为什么这会终止程序Program received signal: SIGABRT并且调试器甚至没有指向我的代码(而是指向某些程序集部分)而不是更好的'索引越界'和'嘿,这行这里的代码错了'错误?

我以为我弄乱了项目配置,所以我在一个全新的项目上重现了这个:同样的结果。

有没有办法让XCode更好用,并以更人性化的方式表明这种错误?

2 个答案:

答案 0 :(得分:2)

As the documentation says

  

如果index超出了数组的末尾(也就是说,如果index更大   NSRangeException是一个NSRangeException,它大于或等于count返回的值   升高

当没有定义异常处理程序时,默认操作是......嗯......你可以看到默认行为是什么。

可以使用@ try / @ catch来捕获异常,但那不是真正的Objective-C-ish。你知道数组中有多少个元素;你没有必要访问不存在的元素。

这样的异常通常有堆栈跟踪,因此您可以返回导致错误的代码行。 (如果LLDB和GDB工作不正常,可能需要在LLDB和GDB之间切换.LLDB更快,更小但不完全可靠。(

答案 1 :(得分:2)

如果您查看Xcode中的控制台日志,您应该看到“范围索引”的内容。 SIGABRT是一个被解雇的断言的结果。有时你必须在崩溃后点击“继续”才能打印消息。

调试器会告诉您实际发生崩溃的位置。它不知道最初的原因是什么。如果调试器让您查看汇编程序,只需向上移动堆栈直到找到代码。