iOS中nil、NSNULL、Nil

1、原由git

参与一个比较成熟的项目的开发,恰好项目新功能上线。结果上线4天奔溃2千个,我看了下倒吸一口凉气。当时,最后排查出来是很简单的缘由新用户注册时H5返回给iOS壳中<NULL>类型数据的处理不当致使于奔溃(不能给NULL类型发送消息)。这代码要是我写的我想可以我吹一生。换而言之,就是扼杀了那么多用户。咱们开发的一行代码糟蹋了多少钱多少运营。虽然这牛逼的bug不是我出品,可是也是狠狠的给我上了一课,因此写此篇博客警醒本身。github

2、重温编程

1.基本概念数组

nil:Defines the id of a null instance(官方),指向一个(实例)对象的空指针。                      NULL:指向其余类型(如:基本类型、C类型)的空指针
Nil:Defines the id of a null class(官方),指向一个类的空指针
NSNull:一般表示集合中的空值安全

nil和NULL指针

nil是指向对象的的指针,针对的是对象,咱们O-C是面向对象的东西。可是NULL是C类型的指针,C语言是一门面向过程的语言。NULL是c语言中指向基础类型的指针,如int等针对的是数据。不要使用NULL去重置对象,可能会产生异常。当咱们将一个对象释放掉的时候将对象置为nil避免野指针。对象

nil和NSNULL开发

nil是O-C中针对于对象使用的,可是容器对象没法包含nil,如集合、字典和数组。因此nil类型的值咱们使用NSNull来存储。当咱们想给容器存nil类型的值时,不能直接将nil存储进去,存储nil类型到容器中会产生崩溃。setValuesForKeysWithDictionary和ditionaryWithValuesForKeys方法能够将NSNull和nil相互转换。不能给NSNULL类型发送消息,会发生崩溃。get

josn字符中的null经过NSJSONSerialization类转换后,可能产生( null )或< null >类型,当咱们在O-C中使用对象去接受这些东西的时候,必定要进行安全判断是否为(null)或者<null>。我碰到的就是返回了<null>类型,使用了NSString接收后,将str传递给注册方法的时候方法内部产生异常。咱们在写代码的过程当中为了程序的健壮性对于须要进行判断的必定不能生。虽然对于nil类型判断没有必要,由于给nil类型发送消息也不会崩溃,可是能够提升代码运行速度(http://xuzhe.com/?p=630)更能养成一个好的编程习惯,写出更好的代码。博客

咱们判断是否有NSNULL类型数据的时候须要这样判断

针对<null>的状况

if([result isEqual:[NSNUll null]]) { 

    NSLog(@"执行");

}

Nil

Nil是针对类对象的空,对此和nil发送消息不会产生崩溃。

3、一个很牛逼的方案

这次为补充,写完博客后就一直注意这方面的消息。在git上找到了一个很牛逼的第三方,能够避免给NULL类型发消息致使的崩溃。即时你工程中有此崩溃,恭喜你,你如今不用苦苦排查此崩溃在何处,亲测NULL致使的崩溃能够避免,使用方式十分简单。下载后倒入.m文件就能够,。牛的一比,使用到了比较底层的技术,抽空在此补充分析下,先供上链接给有须要的人。帮助到的人感谢下我,把快乐传递下,谢谢哈

https://github.com/nicklockwood/NullSafe

相关文章
相关标签/搜索