__NSCFString objectForKeyedSubscript: изключение

Взимам данни от сървъра. Приложението ми работи добре в 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]])

и във всички останали случаи.

Тествам сега и имам в речника си за ID: въведете описание на изображението тук


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


Отговори (2)


Имате екземпляр NSString във вашия речник, където очаквате речник.

Имайте предвид, че вашето „използвайте това вместо това“ няма нищо общо с проблема.

person bbum    schedule 24.05.2013
comment
Така че в моя случай dic е низ? Мога ли да взема идентификатор на обект и след това да разбера дали е речник? Като 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