Objective c iOS崩溃:;此类不符合密钥url的键值编码;
我在crashlytics上得到以下崩溃 致命异常:NSUnknownKeyException [valueForUndefinedKey:]:此类不符合键url的键值编码 这就是一些用户发生崩溃的地方Objective c iOS崩溃:;此类不符合密钥url的键值编码;,objective-c,dictionary,crash,Objective C,Dictionary,Crash,我在crashlytics上得到以下崩溃 致命异常:NSUnknownKeyException [valueForUndefinedKey:]:此类不符合键url的键值编码 这就是一些用户发生崩溃的地方 id url = [[json[@"data"]valueForKey:@"value"]valueForKey:@"url"]; 我不确定什么是最好的方法来防止这次撞车。我相信这是因为在某些情况下,json[@“data”]是一个NSString。所以我想我应该检查一下这是不是一本这样的词
id url = [[json[@"data"]valueForKey:@"value"]valueForKey:@"url"];
我不确定什么是最好的方法来防止这次撞车。我相信这是因为在某些情况下,json[@“data”]
是一个NSString。所以我想我应该检查一下这是不是一本这样的词典
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
}
}
}
您应该逐个检查
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);
对NSString
值调用valueForKey
方法,导致崩溃。如果有人说当字典没有这个键时崩溃的原因是callvalueForKey
,那就错了。有关更多信息
[dictionary Iskindof类:[NSDictionary类]]如果
dictionary
为零,则始终返回NO
,因此不需要在if语句中检查dictionary
。这是不必要的。您的错误意味着json[@“data”]valueForKey:@“value”]
没有NSDictionary,因此它没有@“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"];
}
}
为什么要使用valueForKey:
而不是objectForKey:
?不要使用键值编码,除非您有明确、具体和可理解的理由这样做。@trungduc您现在觉得代码正常吗?我已经更新了我的答案。@CurtRand您应该使用id*value
而不是NSDictionary*value
。这更有意义。其他一切看起来都很好。@CurtRand再来一个,我想你不需要检查json
是否属于类NSDictionary
。我猜,您的json
是一个NSString
,所以只需将json
从NSString
转换为nsdictional
。我必须检查“json”是否是一个NSDictionary,因为有时我得到的数据会以字符串而不是字典的形式返回。@RomanSimenok您不需要检查data
是否是nil
因为[数据是类的种类:[NSDictionary类]
将返回NO
如果数据为nil
;)@trungduc是的,我知道,但是检查它是否为nil或检查它是否不是类的速度有多快?@RomanSimenok正如我猜的那样,检查nil
将放在类的方法的顶部。所以不要担心哪个更快。@RomanSimenok,两个都是valueForKey
和objectForKey
如果没有键的对象,则返回nil
。他的崩溃是因为在NSString
上调用valueForKey
),正如本例中解释的那样,调用类中未定义方法的崩溃……没有太多可添加的内容