【发布时间】:2017-11-14 16:19:13
【问题描述】:
我在 crashlytics 上遇到以下崩溃。
致命异常:NSUnknownKeyException [<__nscfstring> 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
}
}
}
【问题讨论】:
-
你为什么用
valueForKey:而不是objectForKey:?除非您有明确、具体和可理解的理由,否则不要使用键值编码。 -
@trungduc 代码现在看起来还好吗?我已经更新了我的答案。
-
@CurtRand 你应该使用
id *value而不是NSDictionary *value。这更有意义。其他一切看起来都不错。 -
@CurtRand 还有一个,我认为你不需要检查
json是一种类NSDictionary。我猜,您的json是NSString,所以只需将json从NSString转换为NSDictonary。 -
我必须检查 'json' 是否是 NSDictionary,因为有时我得到的数据是作为字符串而不是字典返回的。
标签: objective-c dictionary crash