文档章节

iOS中nil、NSNULL、Nil

gitzhengjianhua
 gitzhengjianhua
发布于 2016/11/15 11:50
字数 934
阅读 44
收藏 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
渭南
私信 提问
iOS nil、Nil、NULL和NSNull 的使用

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

江山风雨
07/04
0
0
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库

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

lewis-180
2015/04/02
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 获取手机的IP地址(内网与外网)

联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 QQ群:807236138 群称:iOS 技术交流学习群 一、概念 1.先是获取内网IP的方法: #import ifaddrs.h #import arpa/inet.h #import net/if.h #defi...

石虎132
09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
11分钟前
0
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
1
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
1
0
单例模式

单例模式(Singleton pattern)属于创建型设计模式。 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对...

NinjaFrog
昨天
1
0
TypeScript基础入门之装饰器(三)

转载 TypeScript基础入门之装饰器(三) 继续上篇文章[TypeScript基础入门之装饰器(二)] 访问器装饰器 Accessor Decorator在访问器声明之前声明。 访问器装饰器应用于访问器的属性描述符,可用...

durban
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部