比较两个字典值会给我一个NSInvalidArgumentException

时间:2017-02-06 06:55:31

标签: ios objective-c dictionary crash nsdictionary

我有一个for循环遍历字典中的字典,试图找到一个具有与完全独立字典中的键匹配的键的字符。

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 个答案:

答案 0 :(得分:1)

  

原因:' - [NSTaggedPointerString objectForKey:]:无法识别   选择器发送到实例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对象,这是最好的解决方案!

答案 1 :(得分:0)

正如用户Nhat Dinh,Amit Tandel和Larme所说,rootDictCopy中的一些词典已经在代码中转换为NSString。我解决了这个问题,让这些词典保持字典,我不再收到这个错误。谢谢大家的帮助!