Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS崩溃:;此类不符合密钥url的键值编码;_Objective C_Dictionary_Crash - Fatal编程技术网

Objective c iOS崩溃:;此类不符合密钥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。所以我想我应该检查一下这是不是一本这样的词

我在crashlytics上得到以下崩溃

致命异常:NSUnknownKeyException [valueForUndefinedKey:]:此类不符合键url的键值编码

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

 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
方法,导致崩溃。如果有人说当字典没有这个键时崩溃的原因是call
valueForKey
,那就错了。有关更多信息


[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
),正如本例中解释的那样,调用类中未定义方法的崩溃……没有太多可添加的内容