iOS中json解析出现NSNull的异常闪退处理方法
2017-03-28 10:04
393 查看
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消息。
这样就完成整个转发链了。
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消息。
这样就完成整个转发链了。
相关文章推荐
- JSONObject.fromObject方法出现处理日期属性异常
- iOS 中json数据解析异常处理
- json解析时出现异常org.json.JSONException: A JSONObject text must begin with '{' at character 1 of {的解决方法
- Gson解析Json字符串出现异常:Expected a BEGIN_ARRAY but was STRING at line 1 column 107 $的解决方法
- Spring RestTemplate 对header type 为 application/json;解析异常的处理方法
- hadoop 安装出现的几种异常的处理方法,hadoop无法启动,no namenode to stop问题的解决方法,no datanode
- CVM下如出现异常情况的处理方法
- iOS中Json解析的四种方法
- 在struts2框架下,JSP页面中用图片做按钮时,老是出现异常信息的处理方法
- android下载xml解析 文件尾出现NUL 导致解析异常的解决方法
- IOS中Json解析的四种方法
- IOS解析Json方法讲解
- IOS中Json解析的四种方法
- SQL2000 企业版 出现“进程51发生了严重的异常”错误的处理方法
- Mysql中的数据用 json_decode 解析返回null的一则处理方法
- IOS中Json解析的四种方法
- Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
- IOS中处理解析数据用JSON上传的对象和可以是JSON
- IOS解析JSON的两种方法
- IOS中Json解析的四种方法