只有iOS 7崩溃:无法识别的select器发送到实例

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

然后我改变了我的代码,

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

运行此代码时。 它再次坠毁,只有iOS 7的版本。 它给了这个错误:

0x00098117 _mh_execute_header [NSNull length]:发送给实例的无法识别的select器

我怎么解决这个问题 ?

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

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

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

希望有所帮助!

正如其他人所说,JSON null将被反序列NSNull 。 与nil不同,你不能发送(大部分)消息给NSNull

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

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

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

另一种select:你也可以添加一个“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的调用即可。

对我来说这是有效的

 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"]]; } } 

我希望这对一个人有帮助。 如果您需要任何帮助,请告诉我。

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

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

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