2

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

假设我们有以下代码:

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

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

我以为我搞砸了项目配置,所以我在一个全新的项目上复制了这个:同样的结果。

有没有办法将 XCode 配置得更好,并以更易于理解的方式指示此类错误?

4

2 回答 2

2

正如文档所说

如果 index 超出数组的末尾(即,如果 index 大于或等于 count 返回的值),则会引发 NSRangeException

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

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

像这样的异常通常有一个堆栈跟踪,所以你可以回到导致错误的代码行。(如果 LLDB 和 GDB 不能正常工作,可能值得在 LLDB 和 GDB 之间切换。LLDB 更快更小,但并不完全可靠。(

于 2012-04-13T13:01:28.640 回答
2

如果您在 Xcode 中查看控制台日志,您应该会看到类似于“超出范围的索引”的内容。SIGABRT 是触发断言的结果。有时您必须在崩溃后点击“继续”才能打印消息。

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

于 2012-04-13T13:01:47.677 回答