特别声明:
本篇文章并非自己原创,是参考「白发三千丈_」作者的博客解决问题之后做的整理,
希望大家能多多支持原创。
作者:白发三千丈_
链接:http://www.jianshu.com/p/02c328387a2c
接手一个新项目之后遇到了一个比较尴尬的局面就是程序多出都是异常崩溃,后来经过一上午的调试之后才发现,异常崩溃都是因为后台返回的数据为<null>导致,所以后来搜了搜资料解决了问题,现将解决方案总结一下。
问题描述:项目使用三方框架进行的数据请求,后台返回的数据未做处理的格式如下,从下边的例子中我们可以看到比较怪异的值就是<null>
,没错就是它导致的程序崩溃。
崩溃原因分析:
JSON数据中包含一个null值,它和oc中的nil其实都是同一个意思就是空的意思,
但是两者是有区别的,nil是可以给对象发送消息不会导致程序崩溃,而null属于C语言中的
一个空值的表示方法,而在oc中null是不可以给对象发送消息所以它导致了程序崩溃。
两者更具体的解释可以参考这个链接去
[https://zhidao.baidu.com/question/1513926460620687580.html]
data = (
{
skin = 1;
province = 2;
buyer = 1;
life = <null>;
solve_skin = <null>;
})
解决方法一:如果项目中存在这样的问题居多可以尝试使用国外一个大牛写的Category,叫做NullSafe 。它运用了oc中runtime的特性,将后台返回的空值数据在运行时将其置为nil,而nil是安全的,可以向对象发送任何message而不会奔溃。
使用方法:
解决方法二:如果项目中存在这样的问题不多的话可以对尝试采用以下办法进行处理:
1.对取值对象类型判断。缺点是太过繁琐,每次都要写。
#define kDictIsEmpty(dic) ([dic isKindOfClass:[NSNull class]])//宏
if (![@"你要取的值" isKindOfClass:[NSNull class]]){
//数据
}
2.字符串匹配。在获取到服务器返回的Json时(返回结果是string对象)通过stringByReplacingOccurrencesOfString方法,替换"null"为"空字符",然后解析。不过通过这个方法也有可能导致数据无法解析
json = [jsonStr stringByReplacingOccurrencesOfString:@":null" withString:@""];
3.解析时把null 类型替换成nil。
//有返回值的宏
#define isToNull(value) \
({\
id tmp;\
if (![value isKindOfClass:[NSNull class]])\
tmp = value;\
else
tmp = nil;\
(tmp);\
})\
//调用方法
label.text = isToNull(dic[@"data"]);
4.如果使用是AFNetwork做网络请求的话,可以用以下代码,会自动去除空值
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.removesKeysWithNullValues = YES;//去除空值
manager.responseSerializer = response;//申明返回的结果是json类
``