我在崩溃时遇到了以下崩溃。
致命异常: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
}
}
}
答案 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"];
}
}