iOS null 的异常处理

作者: evanleeeee | 来源:发表于2018-08-20 15:42 被阅读245次

在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。

问题现象

但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现了原因:由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据:


"somevalue":null 

通过JsonKit 这个第三方库解析出来的数据就成了

somevalue ="";

这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:

-[NSNulllength]: unrecognized selector sent to instance 0x388a4a70

解决方法

其实一直没有找到完美的解决办法,坑了我很久。

1、最开始的解决方法就是为了应付当前遇到的崩溃,看看哪个字段可能为空,那么就对该字段使用前进行判断,通过崩溃时的错误提示可以看出,这样的字段解析成的对象是 NSNull 类型的,所以可以直接判断是不是此类型:

if(![isKindOfClass:[NSNullclass]]){xxxxxxx;}

因为字段实在太多,就找一个补一个。

2、后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null ,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换 null 为 为空字符””,然后再解析。

json = [jsonStr  stringByReplacingOccurrencesOfString:@":null"withString:@":\"\""];

这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json无法解析了。

3、如果你使用AFNetwork 这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值

self.removesKeysWithNullValues =YES;

4、可以利用runtime方法交换,给NSDictionary增加分类,在load方法里替换objectForKey方法,在自定义方法里做null的判断

5、终极方案

终于找到了一劳永逸的方案,牛逼的老外写了一个Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github上查看;

https://github.com/nicklockwood/NullSafe

相关文章

  • iOS null 的异常处理

    在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。 问题现象 但是几个项目...

  • 关于ios “”的异常处理

    在iOS开发过程中经常需要与服务器进行数据通讯,但是在数据接通过程中会出现:null ""等问题导致莫...

  • nil,Nil,null,NSNull的区别

    各自的含义: iOS开发服务器返回(null) 与的处理

  • Future使用原则

    1. 异常处理 whenComplete((result,ex)-> { if(null != ex) { // ...

  • 关于ios “<null>”的异常处理

    在iOS开发过程中需要与服务器进行数据通讯,但是问题来了,接口返回的数据中会出现:null ""等问题...

  • 04. NULL检查机制

    Kotlin 空安全检查机制,有多种处理方式。可以使用 !! 符号,抛出异常可以使用 ? 认可NULL对 NULL...

  • iOS异常处理

    开发iOS应用,解决Crash问题始终是一个难题。Crash分为两种,一种是由EXC_BAD_ACCESS引起的,...

  • iOS异常处理

    尽管当iphone应用崩溃时,它不会告诉用户发生了什么,但我们仍然可以为应用添加异常和信号处理,以此记录和展示发生...

  • Java中如何避免麻烦的null值判断(转载)

    null值判断以及空指针异常应该是我们在代码中经常遇到的。针对null值的处理有两种: (1)将null值替换为n...

  • Kotlin核心编程 第五章类型系统

    null引用 对于空指针异常,当前java已经有了如下处理:1函数内对于无效值,更倾向于抛异常处理;2采用@Not...

网友评论

    本文标题:iOS null 的异常处理

    本文链接:https://www.haomeiwen.com/subject/njjliftx.html