iOS как отладить сбой?

#ios

#iOS

Вопрос:

Сбой моего приложения по неопределенной причине, и в итоге я получаю этот журнал:

MyProj[9442:707] -[Длина NSDecimalNumber]: нераспознанный селектор, отправленный экземпляру 0x2e6690

Могу ли я получить более подробную информацию? Что означает 9442: 707, это номер строки?

Редактировать

В моем коде я добавил трассировки типа:

 NSLog(@"KEYS:%@", myKeys);
NSLog(@"KEYS ORDERED:%@", [myKeys sortedArrayUsingSelector:@selector(compare:)]);
  

Но вторая строка вылетает. Ошибка «длина», с которой я столкнулся, похоже, исходит из этой строки (хотя я нигде не использую [something length]).

 2011-11-11 14:20:18.936 MyProj[9570:707] KEYS:(
  330,
  359,
  362,
  367,
  352,
  351,
  364,
  331,
  350
)

... then crash... with above error
  

Комментарии:

1. ознакомьтесь с этим: как отследить и отладить сбой в iOS: ios-blog.co.uk/tutorials /…

Ответ №1:

Отладчик iOS иногда довольно нечетко описывает точную проблему. Тем не менее, в вашем случае это должно быть ясно. [NSDecimalNumber length] не может быть выполнен, потому что длина метода нам неясна.

Ссылка: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDecimalNumber_Class/Reference/Reference.html

Попробуйте найти строку, в которой вы используете функцию длины, и измените ее на что-то, что действительно работает. С помощью фрагмента кода в вашем вопросе мы могли бы уточнить это.

Комментарии:

1. Я не использую «длину» в коде, похоже, она связана при сортировке массива (я добавил часть кода в вопросе).

2. @Luc: Метод сравнения. Будет делать что-то под прикрытием с функцией длины. Вполне может быть, что.

3. Вы правы, длина вызывается в методе сравнения. Я только что увидел, что сравниваемые объекты не все были NSString, среди них был скрыт NSDecimalNumber… Я изменил его на NSString, и он работает нормально. Спасибо за вашу помощь.

Ответ №2:

9442:707 — это информация о процессе .. здесь это вам не поможет.

Где-то в вашем коде вы отправляете сообщение о длине в NSDecimalNumber.

Можете ли вы заставить сбой произойти в отладчике? Если это так, проверьте стек вызовов во время сбоя, и он должен указать вам прямо на проблему.

Если нет — если ваша кодовая база не слишком велика, вы могли бы выполнить поиск в своем коде по «длине» и проверить везде, где вы отправляете сообщение о длине, чтобы увидеть, могло ли оно отправлять его объекту неправильного типа.

Комментарии:

1. Мне удалось изолировать ошибку, но, похоже, это не из-за явного вызова [something length]. Я обновил вопрос и добавил дополнительные журналы.