【问题标题】:Crashes with [__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array error[__NSArrayM objectAtIndex:] 崩溃:空数组错误的索引 0 超出范围
【发布时间】:2011-10-22 12:01:49
【问题描述】:

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

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

我希望有人知道发生了什么,或者可以为我指明正确的方向。 谢谢。

崩溃报告:

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)

【问题讨论】:

  • 发布整个崩溃日志(与其他线程)查看此崩溃日志并不能说明它崩溃的位置。不太可能是它在操作系统中的错误。
  • 你在用 UICollectionView 吗??
  • 我在尝试更改 collectionView 的 .collectionViewLayout 属性时得到了类似的跟踪。你提到了 UICollectionView;这是否意味着你有一个想法?

标签: objective-c ios crash nsarray


【解决方案1】:

调试此问题的一种方法是在 objectAtIndex 上添加符号断点:这可能会导致 许多 对 objectAtIndex 的命中:在调试器命中您所追求的那个之前,但可以保证找到它.

Xcode 4 中的步骤:

  • 视图 > 导航器 > 断点导航器
  • 单击“+”并在弹出窗口中选择添加符号断点
  • 在符号文本字段中输入“objectAtIndex:”并单击完成

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

【讨论】:

  • 我会尝试,但问题是我从未在自己的任何设备或模拟器中体验过它。由于一直无法复现,调试时怎么会遇到呢?
  • 如果您无法自己重现问题,则可能很难修复错误。事实上,您会注意到,在大多数错误跟踪系统中,通常都有一个“重现步骤”部分。错误再现性可能是实际修复错误的最大步骤。如果不能复现,则需要收集大量日志,做日志分析。
【解决方案2】:

这将在有问题的行停止调试器:

Xcode/Edit Scheme/Diagnostics/Log Exceptions.

【讨论】:

  • 如果这可行:),它不适用于我当前的错误:(
  • 不,它没有。你有什么版本的Xcode?我们还需要设置哪些其他设置?
【解决方案3】:

这个错误意味着,你试图从一个没有找到对象的位置从 NSArray 中获取一个对象。换句话说:如果索引为 0,则您的数组为空。
而且很可能是您的代码,因为 main() 会调用您的代码。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 非常方便的提示。还不知道它是否能解决我的问题,但有几个地方可以让我的代码更简单(因为结果允许为零)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多