iOS crash:[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000053

遇到一个很坑的问题:应用崩溃了,XCode报错:

[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000053

很明显,是类型不对,把__NSCFNumber类型当成了NSString类型调用length造成的crash。但是为什么类型不对,还真调试了一会。

OC代码中接收后端发过来的4个数据,因为想到是直接解析的json格式数据,所以都当成NSString类型处理,蹊跷的是,第一个数据每次都没问题,处理第二个数据时就报上面的错误。调试打印class信息,经过

[NSJSONSerializationJSONObjectWithData]

解析后,第一个数据真的是NSString类型,所以调用length没问题,后面三个数据的确都是__NSCFNumber类型!

查了下后端PHP代码:发现第一个数据的确是按照string类型发的,而后三个数据都是按照数值类型发的。因为PHP是弱类型语言,写代码时对类型不敏感,潜意识里也认为发给前端的都是字符串,这也是我没有第一时间想到问题真正根源的原因。


总结:

OC收到后端的json数据,解析后可能有__NSCFNumber、NSString等类型,要具体确认后端发过来的数据类型,不能想当然的都当成NSString。这和Android开发有很大不同:Android的java解析后都是按照string处理,所以经验有的时候也害人..


知道了问题原因,bug就很容易修了,手动转换一下搞定:

NSString *strLevel = [NSString stringWithFormat:@"%@", dicUserData[@"level"]];

但是还没有研究PHP底层是怎么把数据类型信息打包发送给前端的,而OC又是怎么收到类型信息、识别类型信息并转化为对应类型对象的。


你可能感兴趣的:(ios开发)