2017-02-06 5 views
0

У меня есть цикл for, который выполняет итерации через словари в словаре, пытаясь найти тот, у которого есть ключ, соответствующий ключу из полностью отдельного словаря.Сравнение двух значений словаря дает мне NSInvalidArgumentException

for (id rDCKey in rootDictCopy) 
{ 
    tempHouseNumber = rDCKey; 

    if ([[[rootDictCopy objectForKey:rDCKey] objectForKey:@"RandomUniqueIdentifier"] isEqual:[[routePathRootDictCopy objectForKey:houseNumber] objectForKey:@"RandomUniqueIdentifier"]]) 
    { 
     NSLog(@"done"); 
     goto DONE; 
    } 
} 

Если оба значения равны нулю, все в порядке, и все проходит. Но в тот момент они имеют значение (которое всегда 256 символов длиной NSString), он выходит из строя, что дает мне эту ошибку:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa000000333939394' 

Я понятия не имею, что случилось, и любая помощь будет оценена.

При необходимости можно указать больше кода.

Спасибо.

Обновление: я обновил цикл for для проверки типов, но та же проблема возникает.

Обновление 2: Изменено || к & &

for (id rDCKey in rootDictCopy) 
{ 
    tempHouseNumber = rDCKey; 

    if ([[rootDictCopy objectForKey:rDCKey] isKindOfClass:[NSMutableDictionary class]] && [[routePathRootDictCopy objectForKey:houseNumber] isKindOfClass:[NSMutableDictionary class]]) 
    { 
     if ([[[rootDictCopy objectForKey:rDCKey] objectForKey:@"RandomUniqueIdentifier"] isEqual:[[routePathRootDictCopy objectForKey:houseNumber] objectForKey:@"RandomUniqueIdentifier"]]) 
     { 
      NSLog(@"done"); 
      goto DONE; 
     } 
    } 
    else 
    { 
     NSLog(@"ERROR"); 
    }    
} 
+2

Возможно, вы вызываете objectForKey на объект NSString вместо объекта NSDictionary. Проверьте содержимое rootDictCopy. Вы можете добавить проверку типов. : P –

+0

@AmitTandel Только что проверено, они оба являются правильными NSMutableDictionaries и отображаются в журналах, как и NSMutableDictionary. – JustMe

+0

Можете ли вы отправить, какие журналы отображаются для «rootDictCopy» и «routePathRootDictCopy»? –

ответ

1

reason: '-[NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa000000333939394'

Исключение произошло потому, что вы назвали objectForKey метод с типом объекта NSTaggedPointerString

Перед сравнить следует проверить тип данных. Вы можете сделать, как показано ниже:

if ([obj isKindOfClass:[NSDictionary class]]) { 
    // is a NSDictionary 
    // do further action like get objectForKey, compare .. 
} else { 
    // you don't got what you want -> print error log or something like that 
} 

И ваш код должен быть, как показано ниже:

for (id rDCKey in rootDictCopy) 
{ 
    tempHouseNumber = rDCKey; 
    // TODO: 
    // check if rootDictCopy is a NSDictionary (if needed) 
    // check if routePathRootDictCopy is a NSDictionary (if needed) 
    // check if [rootDictCopy objectForKey:rDCKey] is a NSDictionary 
    // check if [routePathRootDictCopy objectForKey:houseNumber] is a NSDictionary 
    if ([[[rootDictCopy objectForKey:rDCKey] objectForKey:@"RandomUniqueIdentifier"] isEqual:[[routePathRootDictCopy objectForKey:houseNumber] objectForKey:@"RandomUniqueIdentifier"]]) 
    { 
     NSLog(@"done"); 
     goto DONE; 
    } 
} 

Примечание: Мой ответ поможет ваш код работать без сбоя, но вам следует найти, почему вы получили неожиданный тип объекта Вот. И как обязательно вы всегда получили объект NSMutableDictionary, это лучшее решение!

+0

Я попробовал ваше предложение проверить типы, и он передает это без проблем. Эта же проблема возникает, когда я добираюсь до следующей строки. – JustMe

+0

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

+0

сообщение обновлено – JustMe

0

Как пользователи Nhat Dinh, Amit Tandel и Larme предположили, что некоторые словари внутри rootDictCopy были преобразованы в код NSS ранее в коде. Я решил, что эти словари остаются словарями, и я больше не получаю эту ошибку. Спасибо всем за помощь!

Смежные вопросы