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

Suk*_*ruK 9 iphone json objective-c ios ios7

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

{
    voteAverageRating = 0;
    voteCount = 0;
}
Run Code Online (Sandbox Code Playgroud)

我的代码

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

_LB_voteNumber.text = [NSString stringWithFormat:@"(%i)",voteCount];
Run Code Online (Sandbox Code Playgroud)

它适用于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];
Run Code Online (Sandbox Code Playgroud)

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

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

我怎么解决这个问题 ?

Ama*_*mar 40

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

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

检查的原因是,收集对象如NSDictionary不允许值nil,因此它们存储为null.传递intValue给一个NSNull将无法正常工作,因为它无法识别此选择器.

希望有所帮助!


nie*_*bot 6

正如其他人所说,JSON null将被反序列化为NSNull.不同的是nil,你不能发送(大多数)消息NSNull.

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

@implementation NSNull (IntValue)
-(int)intValue { return 0 ; }
@end
Run Code Online (Sandbox Code Playgroud)

现在你的代码将工作,因为发送-intValueNSNull现在将返回0

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

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

@implementation NSNull (IfNullThenNil)
-(id)ifNullThenNil { return nil ; }
@end
Run Code Online (Sandbox Code Playgroud)

现在,您的代码变为:

int voteCount = [[[listDic objectForKey:@"voteCount"] ifNullThenNil] intValue] ;
Run Code Online (Sandbox Code Playgroud)

只需-ifNullThenNil在您从JSON对象访问值的位置添加调用即可.