__NSCFString объектForKeyedSubscript: исключение

Я беру данные с сервера. Мое приложение отлично работает в Sinulator и на тестовом устройстве iPhone 4s, но у одного человека возникла проблема с iPod 4. Он получил исключение:

-[__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1d263a20

Я не могу использовать это устройство, поэтому я пишу код, чтобы узнать, где произошел сбой.

 if (![dictionaryRest[@"compliments"] isEqual:[NSNull null]]) {
       NSMutableArray *array = [NSMutableArray new];
       NSMutableArray *firstArray = [NSMutableArray new];
       for (NSDictionary *dic in dictionaryRest[@"compliments"]) {
            Compliment *compl = [Compliment new];
            if (![dic[@"ID_promotions"] isEqual:[NSNull null]])
                compl.ID = [dic[@"ID_promotions"] integerValue];

Итак, в последних 2 строках это исключение было. В чем причина этого? Я так понимаю, что мне нужно использовать

if ([dict objectForKey:[@"compliments"])

вместо

if (![dict[@"compliments"] isEqual:[NSNull null]])

и во всех других случаях.

Сейчас я тестирую, и в моем словаре есть идентификатор: введите описание изображения здесь


person user2213271    schedule 24.05.2013    source источник


Ответы (2)


У вас есть экземпляр NSString в вашем словаре, где вы ожидаете словарь.

Обратите внимание, что ваше «используйте это вместо этого» не имеет ничего общего с проблемой.

person bbum    schedule 24.05.2013
comment
Так что в моем случае dic это строка? Могу ли я взять объект id и узнать, является ли он словарем? Нравится for (id obj in dictionaryRest[@"compliments"]) if([obj isKindOfClass:[NSDictionary class]]) И если это словарь я продолжу - person user2213271; 24.05.2013
comment
Может быть. Вам лучше ответить, почему у вас есть строка, если вы думаете, что это словарь, вместо того, чтобы писать код, который просто игнорирует проблему. Я бы посоветовал NSLog(@"dict %@", dictionaryRest); убедиться, что вы точно знаете, что происходит с вашими данными! - person bbum; 25.05.2013

-objectForKeyedSubscript: метод экземпляра объекта NSDictionary. __NSCFString objectForKeyedSubscript: исключение указывает, что метод -objectForKeyedSubscript каким-то образом вызывается для некоторого объекта NSString. Таким образом, вам просто нужно правильно проверить класс объекта, прежде чем вы сможете с уверенностью предположить, что это действительно словарь.

if([dic isKindOfClass:[NSDictionary class]]) 
{
    id obj = dic[@"key"];
}
person govind sah    schedule 19.10.2016