只有iOS 7崩溃[NSNull intValue]:发送到实例的无法识别的选择器

时间:2013-09-19 06:38:04

标签: iphone ios objective-c json ios7

我想从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 length]:无法识别的选择器   发送到实例

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:39)

在从JSON访问值之前进行检查,例如

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

检查的原因是,NSDictionary等集合对象不允许值为nil,因此它们存储为null。将intValue传递给NSNull将无效,因为它无法识别此选择器。

希望有所帮助!

答案 1 :(得分:6)

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

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

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

现在您的代码将有效,因为将-intValue发送到NSNull现在将返回0

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

@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的调用。

答案 2 :(得分: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"]];

    }
}

我希望它有所帮助。如果您需要任何帮助,请告诉我。

答案 3 :(得分:0)

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

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

真正的问题不是您的应用程序崩溃,而是您的应用程序无法处理它应该处理的JSON数据。