背景:
服务返回的数据有可能会出现,key:null 这种情形. 对于这种情况,提供三种思路处理. 同时欢迎提供其它更合适的方式处理
- 1.如果使用AFN框架可以 removesKeysWithNullValues
- 2.无论离散或者集约型网络请求,应该存在一个统一的返回 response 的地方, 可以在此集中处理,简化的代码可能如下
// 1. 接受到服务返回的 response
// 2. 序列化
// 3. 清除json中的null - 避免[NSNull null]导致的crash
json = [JSONUtils JSONObjectWithoutNull:json];
其中 JSONObjectWithoutNull:
的方法实现可以参考 JSONUtils
- 3.可以参考 NullSafe ,早在12年就已经给出的解决方案>_<.
NuffSafe原理:
简单点说,当我们给一个NSNull对象发送消息的话,可能会崩溃(null是有内存的),而发送给nil的话,是不会崩溃的。
作者就是使用了这么一个原理,把发送给NSNull的而NSNull又无法处理的消息经过如下几步处理:
1.创建一个方法缓存,这个缓存会缓存项目中类的所有类名。
2.遍历缓存,寻找是否已经有可以执行此方法的类。
3.如果有的话,返回这个NSMethodSignature。
4.如果没有的话,返回nil,接下来会走forwardInvocation:方法。
5.[invocation invokeWithTarget:nil];将消息转发给nil。
那么,如何判断NSNull无法处理这个消息呢,在OC中,系统如果对某个实例发送消息之后,它(及其父类)无法处理(比如,没有这个方法等),系统就会发送methodSignatureForSelector消息,如果这个方法返回非空,那么就去执行返回的方法,如果为nil,则发送forwardInvocation消息。
这样就完成整个转发链了。
以上参考: NullSafe 的原理是什么?
最后, 希望这些对你有所帮助
网友评论