只有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
现在你的代码将工作,因为发送-intValue
到NSNull
现在将返回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数据。