NSString.length вызывает сбой (NSInvalidArgumentException)

У меня есть приложение для iPad (XCode 6.1.1, iOS 8.1, ARC), и когда я запускаю его на симуляторе 8.1, приложение вылетает, сравнивая длину строки. Это работает уже больше года и вчера прекратилось. Это код:

Это код в файле .h:

@property NSString *shopOpenHour;
@property NSString *shopCloseHour;

Это код в файле .m:

@synthesize shopOpenHour;
@synthesize shopCloseHour;

и:

if(shopOpenHour.length == 0 || shopCloseHour.length == 0)  { 

и это также вызывает сбой:

NSLog(@"\n\nlength test: %d", (int)shopCloseHour.length);

Это ошибка, которую я получаю:

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[__NSCFNumber length]: нераспознанный селектор отправлен экземпляру 0xb000000000003203»

Он отлично работает под управлением симулятора 7.1 и iPad под управлением iOS 8.1. Я не понимаю, где/почему NSCFNumber "на картинке".

Мой вопрос: какие-либо идеи о том, что вызывает это (прежде чем я отправлю RADAR?)


person SpokaneDude    schedule 10.01.2015    source источник
comment
Похоже, это воспроизводимо. Почему бы не определить свои собственные сеттеры, которые проверяют тип своего аргумента и выводят трассировку стека/точку останова, когда это не NSString?   -  person CRD    schedule 10.01.2015
comment
Может быть, вы определили другое поле с именем shopCloseHour? Замените shopCloseHour на _shopCloseHour в выражениях if и NSLog и повторите попытку.   -  person Danny Daglas    schedule 10.01.2015


Ответы (1)


Где-то вы назначили NSNumber для shopCloseHour, это может произойти при присвоении значения из json. Проверьте

if ([shopCloseHour isKindOfClass:[NSString class]]) {
    // this is a string …
}
person Luca Rocchi    schedule 10.01.2015
comment
По-видимому, он изменяется при сохранении или извлечении из NSUserDefaults. Большое спасибо... сегодня у меня будет много дел! :D - person SpokaneDude; 10.01.2015
comment
Лучше устранить причину проблемы. Использование оператора if в этом ответе было бы полезно для отладки, но код не должен оставаться. - person rmaddy; 10.01.2015
comment
Чтобы защититься от этого, вы должны использовать специфичные для типа методы NSUserDefaults, чтобы избежать этого, а не использовать objectForKey: - person Jeremy Huddleston Sequoia; 11.01.2015