繁体   English   中英

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

[英]Comparing two dictionary values gives me an NSInvalidArgumentException

我有一个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");
    }             
}

原因:'-[NSTaggedPointerString objectForKey:]:无法识别的选择器已发送到实例0xa000000333939394'

发生异常是因为您使用对象类型NSTaggedPointerString调用了objectForKey方法

比较之前,您应该检查数据类型。 您可以执行以下操作:

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对象,那是最好的解决方案!

正如用户Nhat Dinh,Amit Tandel和Larme所建议的那样,rootDictCopy中的某些词典已在代码的早期转换为NSString。 我已修复该问题,使这些词典仍然是词典,并且不再收到该错误。 感谢大家的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM