iOS中nil、NSNULL、Nil
iOS中nil、NSNULL、Nil
gitzhengjianhua 发表于11个月前
iOS中nil、NSNULL、Nil
  • 发表于 11个月前
  • 阅读 8
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

一、起因

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

二、重温

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类型发送消息,会发生崩溃。

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发送消息不会产生崩溃。

三、一个很牛逼的方案

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

https://github.com/nicklockwood/NullSafe

 

 

共有 人打赏支持
gitzhengjianhua
粉丝 5
博文 25
码字总数 23833
作品 3
×
gitzhengjianhua
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: