Сбои с [__NSArrayM objectAtIndex:]: индекс 0 выходит за границы для ошибки пустого массива - PullRequest
7 голосов
/ 22 октября 2011

Я получаю отчеты о сбоях через пользователей моего приложения для iOS, но при сбое я не могу воспроизвести себя и не могу отследить ошибку до строки в своем собственном коде (за исключением того, что она возникает из строки 14 в main.m но это приложение по умолчанию для приложений 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)

Ответы [ 4 ]

20 голосов
/ 23 октября 2011

Одним из способов устранения этой проблемы является добавление символической точки останова на objectAtIndex: это может привести к множеству обращений к objectAtIndex: до того, как отладчик сработает на том, за которым вы работаете, но он гарантированно найдет его.

Шаги в Xcode 4:

  • Вид> Навигаторы> Навигатор точек останова
  • нажмите «+» и выберите «Добавить символическую точку останова» во всплывающем окне
  • введите «objectAtIndex:» в текстовом поле «Символ» и нажмите «Готово»

во время выполнения, если вы не можете сказать, какой объектAtIndex: вы нажимаете, переместите ползунок внизуНавигатор отладки полностью вправо.

3 голосов
/ 29 января 2012

Это остановит отладчик на ошибочной линии:

Xcode / Редактировать схему / Диагностика / Исключения журнала.

2 голосов
/ 22 октября 2011

Эта ошибка означает, что вы пытаетесь получить объект из NSArray из позиции, где объект не найден. Другими словами: если индекс равен 0, то ваш массив пуст.
И, скорее всего, это ваш код, так как main () вызывает ваш код.

1 голос
/ 22 октября 2011

Вам нужно найти в вашем проекте все случаи использования objectAtIndex: и исключить каждого из них как виновника. Убедитесь, что вы никогда не вызываете его в пустом массиве.

Еще один совет: если вы знаете, что хотите получить только последний объект в массиве, или , вы знаете, что массив будет содержать только один объект, вы можете использовать lastObject вместо objectAtIndex: - это безопаснее, потому что он не будет выдавать исключение, хотя вам все равно нужно проверить nil.

...