Странный BAD_ACCESS при печати NSInteger - PullRequest
1 голос
/ 05 марта 2012

я впервые спрашиваю здесь что-то, так что не будьте слишком резкими со мной, пожалуйста :-). У меня странная проблема "плохого доступа". В моем классе у меня есть NSInteger вместе с несколькими другими членами. Я переопределяю метод - (NSString *)description, чтобы напечатать значения всего, что есть (пропущена несущественная часть):

- (NSString *)description {
    return [NSString stringWithFormat:@"Duration:%d", duration];
}

и затем я печатаю это, используя NSLog(@"%@", myObject), что дает мне EXC_BAD_ACCESS без каких-либо сообщений журнала, независимо от NSZombieEnabled.

  • Я дважды проверил порядок всех спецификаторов форматирования и параметры - это правильно.
  • Я попытался изменить спецификатор формата на %i и %@ и не получил никакого результата
  • Когда я инициализирую свой объект, я не инициализирую продолжительность. Позже я назначаю его через свойство @property NSInteger duration. Поэтому я попытался инициализировать длительность до 0 в моем init метод, но безрезультатно.
  • Если я укажу продолжительность NSNumber до печать, это работает.
  • Когда я удаляю продолжительность и оставляю все другие ивары это работает снова.

Я в тупике, что я здесь не так делаю? Вы можете мне помочь?

Большое спасибо!

РЕДАКТИРОВАТЬ: Подводя итог, кажется, это вызвано различиями между 32 и 64-битными платформами, потому что это нормально при запуске на iphone 4 и имеет проблемы только при запуске в симуляторе. Я попробовал 3 различных подхода - используя %d и %i с самой переменной NSInteger, используя %qi и используя %ld / %lx, и я также пытался привести к int и long с различными спецификаторы формата. Каждый раз, когда я могу запустить на устройстве, но получить EXC_BAD_ACCESS в симуляторе.

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Единственное предположение здесь: NSInteger может быть 64-битным в вашем случае, и% i (как и% d) ожидает 32-битное целое число, вы можете попробовать% qi или (что кажется лучше) привести значение явно.

0 голосов
/ 05 марта 2012

Когда вы запускаете приложение в отладчике, где точно сигнал повышается?Xcode покажет вам точную строку и стек проблемы.

Когда вы уверены, что сбой происходит в методе stringWithFormat:, это, вероятно, вопрос спецификаторов формата. Apple Руководство по программированию строк содержит информацию о том, как обрабатывать NSInteger безопасным и независимым от платформы способом.

0 голосов
/ 05 марта 2012

Может быть, вам нужно синтезировать вашу собственность?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...