【问题标题】:Only iOS 7 crash [NSNull intValue]: unrecognized selector sent to instance只有 iOS 7 崩溃 [NSNull intValue]:无法识别的选择器发送到实例
【发布时间】:2013-09-24 03:03:36
【问题描述】:

我想从 JSON 服务获取数据。从 JSON 值获取数据时,只有 iOS 7 版本会崩溃。 它从下面的 JSON 服务返回:

{
    voteAverageRating = 0;
    voteCount = 0;
}

我的代码

int voteCount = [listDic objectForKey:@"voteCount"] intValue] ;

_LB_voteNumber.text = [NSString stringWithFormat:@"(%i)",voteCount];

它适用于 iOS 5、5.1、6.0、6.1,但它只崩溃 iOS7 版本。它给出了这个错误:

0x00098117 _mh_execute_header [NSNull intValue]:无法识别的选择器 发送到实例

然后我在下面更改了我的代码;

NSString *voteCount = [listDic objectForKey:@"voteCount"] ;

_LB_voteNumber.text = [NSString stringWithFormat:@"(%@)",voteCount];

何时运行此代码。它再次崩溃只有 iOS 7 版本。它给出了这个错误:

0x00098117 _mh_execute_header [NSNull 长度]:无法识别的选择器 发送到实例

我该如何解决这个问题?

【问题讨论】:

  • 你能打印出你的字典的描述并添加到问题中吗?

标签: iphone ios objective-c json ios7


【解决方案1】:

对我来说这是可行的

NSArray* merStore = [tmpDictn objectForKey:@"merchantStore"];

if ([merStore isKindOfClass:[NSArray class]] && merStore.count !=0)
{
    for(int n = 0; n < merStore.count; n++)
    {
        NSMutableDictionary *storeDic = [merStore objectAtIndex:n];


        [latitudeArray addObject:[storeDic objectForKey:@"latitude"]];

    }
}

我希望它可以帮助一些人。如果您需要任何帮助,请告诉我。

【讨论】:

    【解决方案2】:

    正如其他人所说,JSON null 将被反序列化为NSNull。与nil 不同,您不能向NSNull 发送(大多数)消息。

    一种解决方案是通过类别在 NSNull 上添加 -intValue 的实现:

    @implementation NSNull (IntValue)
    -(int)intValue { return 0 ; }
    @end
    

    现在您的代码可以工作了,因为将-intValue 发送到NSNull 现在将返回0

    另一种选择:您还可以将“IfNullThenNil”类别添加到 NSObject...

    @implementation NSObject (IfNullThenNil)
    -(id)ifNullThenNil { return self ; }
    @end
    
    @implementation NSNull (IfNullThenNil)
    -(id)ifNullThenNil { return nil ; }
    @end
    

    现在,您的代码变为:

    int voteCount = [[[listDic objectForKey:@"voteCount"] ifNullThenNil] intValue] ;
    

    只要从 JSON 对象访问值,只需添加对 -ifNullThenNil 的调用即可。

    【讨论】:

      【解决方案3】:

      这很正常。 JSON 可以向您的应用发送空值。如果是这样,那么这是由服务器有意完成的,它希望您处理它。找出收到空值时的正确行为。然后当你得到一个可能是空值的对象时,检查

      if (object == [NSNull null])
      {
          // stuff to handle null objects
      }
      else
      {
          // stuff to handle non-null objects
      }
      

      真正的问题不是您的应用崩溃,而是您的应用没有处理它应该处理的 JSON 数据。

      【讨论】:

        【解决方案4】:

        在从 JSON 中访问值之前先检查一下,

        if([NSNull null] != [listDic objectForKey:@"voteCount"]) {
            NSString *voteCount = [listDic objectForKey:@"voteCount"];
            /// .... 
        }
        

        检查的原因是,像NSDictionary 这样的集合对象不允许值是nil,因此它们被存储为空。将intValue 传递给NSNull 将不起作用,因为它无法识别此选择器。

        希望有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-23
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多