文档章节

iOS中nil、NSNULL、Nil

gitzhengjianhua
 gitzhengjianhua
发布于 2016/11/15 11:50
字数 934
阅读 42
收藏 1

一、起因

参与一个比较成熟的项目的开发,刚好项目新功能上线。结果上线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

gitzhengjianhua

粉丝 4
博文 25
码字总数 23833
作品 3
渭南
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库

AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。它的模块架构被良好的设计,拥有丰富的功能,...

lewis-180
2015/04/02
0
0
iOS nil、Nil、NULL和NSNull 的使用

nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一个对象,是类的meta-class的实例),而N...

江山风雨
07/04
0
0
iOS 开发 nil/Nil/NULL/NSNull的区别

C用0来作为不存在的原始值,而NULL作为指针(这在指针环境中相当于0)。 Objective-C在C的表达不存在的基础上增加了nil。nil是一个指向不存在的对象指针。虽然它在语义上与NULL不同,但它们在技...

神补刀
2015/11/12
0
0
iOS中nil Nil NULL 区别

一、nil 当一个对象置为nil时,这个对象的内存地址就会被系统收回。置空之后是不能进行retain,copy等跟引用计数有关的任何操作的。 二、Nil nil完全等同于Nil,只不过由于编程习惯,人们一般...

RainOrz
05/07
0
0
iOS中,对象释放机制以及__weak、__unsafe_unretained的一些问题

iOS中,首先有一点可以确认的,就是weak修饰的,在持有或者引用为0的时候,为自动将对象nil,iOS中对于一个nil发消息是不会发生崩溃等问题的,而unsafeunretained则不然,他不会销毁置为nil,因...

RainOrz
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

最全最强解析:支付宝钱包系统架构内部剖析(架构图)

支付宝系统架构概况 典型处理默认 资金处理平台 财务会计 支付清算 核算中心 交易 柔性事务 支付宝的开源分布式消息中间件–Metamorphosis(MetaQ) Metamorphosis (MetaQ) 是一个高性能、高可...

晨猫
38分钟前
4
0
竞品分析

那什么样的场景需要用关键纬度分析法分析竞品呢? 竞品分析的目的是为了看竞品们和自己产品重合的业务都具备哪些功能点,以及这些功能是怎么做的,以此确定自己产品的优化方向。 竞品们的业务...

于谦老师
45分钟前
1
0
OSChina 周三乱弹 —— 公司女同事约我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享水木年华的单曲《蝴蝶花(2002年大提琴版)》 《蝴蝶花(2002年大提琴版)》- 水木年华 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
1K
17
Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
9
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部