iOS中json解析出现NSNull的异常闪退处理方法

JSON建构有两种结构:

json简单说就是JavaScript中的对象和数组,所以这两种结构就是对象和数组2种结构,通过这两种结构可以表示各种复杂的结构

  • 1、对象:对象在js中表示为“{}”扩起来的内容,数据结构为
    {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key
    获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
  • 2、数组:数组在js中是中括号“[]”扩起来的内容,数据结构为
    [“Java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。
    经过对象、数组2种结构就可以组合成复杂的数据结构了。

为什么后台在返回的接口里面数据会出现“NSull”数据?

  • 这是由于在数据库里面,默认数据为NSull,如果你修过数据后,又删除,那么数据库会自动补充上NSull

  • 我们可以在数据里面,修改默认数据的方式:在创建表的时候,添加上not null default ’ ‘

下面我们来了解下怎么解决这个问题,这里用了ios的Runtime运行时来解决,防止出现程序闪退的情况。
在Github上找到一个牛逼的老外写了一个Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github上查看;

简单点说,当我们给一个NSNull对象发送消息的话,可能会崩溃(null是有内存的),而发送给nil的话,是不会崩溃的。
作者就是使用了这么一个原理,把发送给NSNull的而NSNull又无法处理的消息经过如下几步处理:

创建一个方法缓存,这个缓存会缓存项目中类的所有类名。
遍历缓存,寻找是否已经有可以执行此方法的类。
如果有的话,返回这个NSMethodSignature。
如果没有的话,返回nil,接下来会走forwardInvocation:方法。
[invocation invokeWithTarget:nil];将消息转发给nil。
那么,如何判断NSNull无法处理这个消息呢,在OC中,系统如果对某个实例发送消息之后,它(及其父类)无法处理(比如,没有这个方法等),系统就会发送methodSignatureForSelector消息,如果这个方法返回非空,那么就去执行返回的方法,如果为nil,则发送forwardInvocation消息。

这样就完成整个转发链了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值