在调用intvalue之前对字符对象进行null检查仍会导致对null对象进行intvalue调用

时间:2015-01-21 10:19:00

标签: objective-c dictionary

我从Web服务器读取json后得到一个字典数组,并使用以下内容确保在获取其int值之前在数组的第一个字典中得到一个特定的键:

             if([jsonObject[0] objectForKey:@"votes"]!= nil)
             {
             int votes = [[jsonObject[0] objectForKey:@"votes"] intValue];
             [[UserObject userUnique] updateVotes:votes];
             }                 

然而,我的应用程序仍偶尔崩溃,说我在Null上调用了intValue。我还尝试将控制语句结构化为

if([jsonObject[0] objectForKey:@"votes"])

但这也会导致同样的错误/应用程序崩溃。我的语法似乎与SO(Check if key exists in NSDictionary is null or not)上的已接受答案一致。关于应用intvalue的任何其他/我应该检查键值对的存在的任何建议?

感谢您的任何建议。

3 个答案:

答案 0 :(得分:0)

在您的代码中连续。不要运行方法。最好在使用json时添加更多的null和type检查。我们这样做:

if (jsonObject && [jsonObject isKindOfClass:[NSArray class]])
{
  NSArray *jsonArray=(NSArray *)jsonObject;
  if (jsonArray.count>0)
  {
    id firstObject=jsonArray[0];
    if ([firstObject isKindOfClass:[NSDictionary class]])
    {
      NSDictionary *jsonDict=(NSDictionary *)firstObject;
      id votesNumber=jsonDict[@"votes"];
      if (votesNumber && [votesNumber isKindOfClass:[NSNumber class]])
      {
        int votes=[votesNumber intValue];
        [[UserObject userUnique] updateVotes:votes];
      }
    }
  }
} 

现在代码更安全了。它还会崩溃吗?

答案 1 :(得分:0)

nilnull之间存在差异。 nil不是对象:它是一个特殊的指针值。 null(由[NSNull null]重新调整)是一个对象:它是必需的,因为它可以存储在NSDictionary等容器中。

NSString *votesString = [jsonObject[0] objectForKey:@"votes"];
if (votesString != nil && votesString != [NSNull null])
{
    int votes = [votesString intValue];
    [[UserObject userUnique] updateVotes:votes];
}

编辑: @SunnysideProductions问题的答案

您提到的帖子建议您通过创建null方法将nil值转换为-safeObjectForKey:值。您没有使用-safeObjectForKey:,而是使用默认的-objectForKey:方法。

答案 2 :(得分:0)

当您在可为空的字典中调用objectForKey时,应用崩溃了,因此我通过以下方式解决了此问题。

- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;

if (dictionary && (object != [NSNull null])) {
    self.name = [dictionary objectForKey:@"name"];
    self.age = [dictionary objectForKey:@"age"];
}
return self;

}