iOS崩溃:"这个类不是密钥值编码兼容的关键URL"

时间:2017-11-14 16:19:13

标签: objective-c dictionary crash

我在崩溃时遇到了以下崩溃。

  

致命异常:NSUnknownKeyException       [< __ NSCFString 0x1742aeb80> valueForUndefinedKey:]:此类不是密钥URL的密钥值编码。

这是一些用户发生崩溃的地方。

 id url = [[json[@"data"]valueForKey:@"value"]valueForKey:@"url"];

我不确定防止此次崩溃的最佳方法是什么。我相信这是因为json[@"data"]在某些情况下是一个NSString。所以我相信我应该检查这是否是这样的NSDictionary。

if ([json[@"data"] isKindOfClass:[NSDictionary class]]) {
     id url = [[json[@"data"]valueForKey:@"value"]valueForKey:@"url"];
    }

任何提示或建议都表示赞赏。

这是我从这里得到答案后的最终结果。这看起来不错吗?我一开始并没有包含所有代码以保持简单。

        if ([json isKindOfClass:[NSDictionary class]]) {
            id url = nil;
            id type = nil;

            NSDictionary *data = json[@"data"];

            if ([data isKindOfClass:[NSDictionary class]]) {
                type = data[@"type"];
                NSDictionary *value = data[@"value"];

                if ([value isKindOfClass:[NSArray class]]) {
                    url = [value valueForKey:@"url"];
                }

                if ([type isKindOfClass:[NSString class]] && [url isKindOfClass:[NSArray class]] && [url count] != 0) {
                   // do stuff
              }
            }
         }

2 个答案:

答案 0 :(得分:1)

您应该逐个检查NSDictionary以防止崩溃。试试下面的代码

NSDictionary *dictionary = json[@"data"];
NSString *output = @"";
if ([dictionary isKindOfClass:[NSDictionary class]]) {
  dictionary = dictionary[@"value"];
  if ([dictionary isKindOfClass:[NSDictionary class]]) {
    output = dictionary[@"url"];
  }
}
NSLog(@"%@", output);

由于在valueForKey值上调用NSString方法而导致崩溃。如果有人说当字典没有这个密钥时崩溃的原因是调用valueForKey,那就错了。有关详细信息Sending a message to nil in Objective-C

如果NO为零,则

[dictionary isKindOfClass:[NSDictionary class]]始终返回dictionary,因此无需检查dictionary中的if statement。这是不公平的。

答案 1 :(得分:-3)

您的错误表示json[@"data"]valueForKey:@"value"]没有NSDictionarry,因此没有@"url"密钥。

valueForKey它的KVC方法,使用objectForKey作为词典,并添加更多支票,如:

        id url = nil;
        NSDictionary *data = [json objectForkey:@"data"];
        if ([data isKindOfClass:[NSDictionary class]]) {
            NSDictionary *value = [data objectForKey:@"value"];
            if ([value isKindOfClass:[NSDictionary class]]) {
                url = [value objectForKey:@"url"];
            }
        }