与[__NSArrayM objectAtIndex:]崩溃:索引0超出空数组错误的边界

时间:2011-10-22 12:01:49

标签: objective-c ios crash nsarray

我正在通过我的iOS应用程序的用户收到崩溃报告,但崩溃我无法重现自己,也无法将错误追溯到我自己的代码中的一行(除了它来自main.m中的第14行)但这是iOS应用程序的默认应用程序创建。在我收到的崩溃报告之下。

理解在某个时刻,正在从空数组中检索索引为0的对象。但是因为它似乎没有指向我自己的代码,它可能是iOS中的一个错误吗? (它发生在不同的平台和不同的iOS版本上)。

我希望有人知道发生了什么,或者能指出正确的方向。 感谢。

CRASH REPORT:

Incident Identifier: [TODO]
CrashReporter Key:   [TODO]
Process:         Mary Black [797]
Path:            /var/mobile/Applications/28A68F8B-294E-4B86-9E75-ED5484E5EF4D/Mary Black.app/Mary Black
Identifier:      net.broset.Mary-Black
Version:         225
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2011-10-14 03:47:32 +0000
OS Version:      iPhone OS 5.0 (9A334)
Report Version:  104

Exception Type:  SIGTRAP
Exception Codes: #0 at 0x35b07848
Crashed Thread:  0

Application Specific Information:
*** Terminating app due to uncaught exception \\\'NSRangeException\\\', reason: \\\'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array\\\'

Thread 0 Crashed:
0   libsystem_kernel.dylib              0x00010848 __kill + 8
1   CoreFoundation                      0x000b9987 __handleUncaughtException + 75
2   libobjc.A.dylib                     0x000092d1 _objc_terminate + 129
3   libc++abi.dylib                     0x000043c5 _ZL19safe_handler_callerPFvvE + 77
4   libc++abi.dylib                     0x00004451 operator delete(void*) + 1
5   libc++abi.dylib                     0x00005825 __cxa_current_exception_type + 1
6   libobjc.A.dylib                     0x00009235 objc_exception_rethrow + 13
7   CoreFoundation                      0x0000f545 CFRunLoopRunSpecific + 405
8   CoreFoundation                      0x0000f3a5 CFRunLoopRunInMode + 105
9   GraphicsServices                    0x00003fed GSEventRunModal + 157
10  UIKit                               0x00031743 UIApplicationMain + 1091
11  Mary Black                          0x00002fa7 main (main.m:14)

4 个答案:

答案 0 :(得分:20)

调试此问题的一种方法是在objectAtIndex上添加一个符号断点:这可能导致许多命中objectAtIndex:在调试器击中你之前的那个之前但保证找到它。

Xcode 4中的步骤:

  • 查看>导航器>断点导航器
  • 单击“+”并在弹出窗口中选择“添加符号断点”
  • 在“符号”文本字段中键入“objectAtIndex:”,然后单击“完成”

在运行时,如果您无法分辨哪个objectAtIndex:您正在点击,请将Debug Navigator底部的滑块一直移到右侧。

答案 1 :(得分:3)

这将使调试器停在违规行:

Xcode / Edit Scheme / Diagnostics / Log Exceptions。

答案 2 :(得分:2)

此错误表示您尝试从未找到对象的位置从NSArray获取对象。换句话说:如果索引为0,则表示数组为空 而且很可能是你的代码,因为main()会调用你的代码。

答案 3 :(得分:1)

您需要在项目中搜索objectAtIndex:的所有用法,并排除每个用户的罪魁祸首。确保你从不在空数组上调用它。

另一个提示:如果你知道你只想获取数组中的最后一个对象,你知道数组只会包含一个对象,你可以使用lastObject代替objectAtIndex: - 它更安全,因为它不会抛出异常,但您仍然需要检查nil