NSNumber进行比较,被比较数据出现nil造成的crash:-[__NSCFNumber compare:]: nil argument

NSNumber进行比较出现nil,造成的crash

场景再现:上线后出现大量crash,crash发生在iOS8和iOS9设备中。同一设备多次请求,造成crash率暴增。

问题解决:经过测试发现,在nsnumber的比较方法中,从接口中获得数据,然后和本地缓存数据进行比较,这个时候老版本没有相应的字段,iOS8和iOS9设备的Coredata将这种数据直接置为nil而没有设置为0,而isEqualToNumber在后面的参数为空时,可能crash。这就造成用户升级后出现crash,这个时候紧急关闭升级通道,减少老用户升级后的crash。

总结教训:1.接口升级时,一定考虑新老用户的兼容问题,以及本地数据缓存为空的情况。2.一方面,增加相应的方法,进行预先判断,防止对nil进行比较;另一方面,利用运行时动态更改isEqualToNumber方法,抛出crash问题。3.老系统一定要做兼容性测试。

推荐阅读更多精彩内容