【问题标题】:Crash when assigning null to NSString from JSON data从 JSON 数据将 null 分配给 NSString 时崩溃
【发布时间】:2018-05-04 16:58:53
【问题描述】:

我遇到了崩溃,我已将范围缩小到这行代码,但我不明白如何避免它。

NSString *variantImageUrl = variantEdge[@"node"][@"image"][@"src"];

如果 src 的值为 null,则应用程序崩溃并显示以下错误消息

    2017-11-21 17:23:27.023988+0800 NWMPos[3218:2124447] -[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1b2a01650
2017-11-21 17:23:27.026199+0800 NWMPos[3218:2124447] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1b2a01650'

只要 src 的值是正确的字符串,它就可以正常工作

但是在分配它之前我无法检查 null 的值,那么如何避免崩溃?

【问题讨论】:

  • 根据报错信息,variantEdge[@"node"][@"image"] 或variantEdge[@"node"] 似乎为空。检查stackoverflow.com/questions/15237199/… ?
  • 啊,我明白你的意思了,我以为 src 是空的,但实际上整个密钥都消失了,所以图像本身是空的,我只是不确定如何测试,我确实阅读了链接但我还是有点迷茫
  • stackoverflow.com/questions/4839355/… ?否则,使用上一个链接答案上的类别应该为variantEdge[@"node"] 返回 nil 而不是 null,然后它不应该崩溃。

标签: ios objective-c json nsstring


【解决方案1】:

添加空检查:

if(![variantEdge[@"node"][@"image"][@"src"] isEqual:[NSNull null]])
{
    NSString *variantImageUrl = variantEdge[@"node"][@"image"][@"src"];
}

【讨论】:

    【解决方案2】:

    笨手笨脚,但是

    NSDictionary *dict = variantEdge;
    
    for (NSString *key in @[@"node", @"image"]) {
       dict = dict[key];
       if (![dict isKindOfClass:NSDictionary.class]) {
          dict = nil;
          break;
       }
    }
    
    NSString *url = dict ? dict["src"] : nil;
    

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多