文档章节

iOS中nil、NSNULL、Nil

gitzhengjianhua
 gitzhengjianhua
发布于 2016/11/15 11:50
字数 934
阅读 42
收藏 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

gitzhengjianhua

粉丝 4
博文 25
码字总数 23833
作品 3
渭南
iOS中nil Nil NULL 区别

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

RainOrz ⋅ 05/07 ⋅ 0

程序员随笔:使用来自服务器的图像(有源码)

如果您是移动应用程序开发人员,则在某个时间点您需要与后端进行互动。您可能需要做的其中一项任务是从服务器检索并显示图像,或将图像提交给该服务器。提交图像时应该使用什么格式?如何将从...

菇哒微课 ⋅ 04/25 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

iOS开发之UIView与UIViewController的生命周期总结

iOS开发中,创建View常见的两种方式一个是纯代码,一个是借助于XIB;创建ViewController常见的也有两种方式一个是纯代码,一个是借助于StoryBoard。 通过交流我发现很多童鞋对这些概念都很模...

YungFan ⋅ 03/22 ⋅ 0

UUID、UDID、Keychain

一、UDID 自从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID,现在是不可能了(因为UDID是设备的唯一标识符,...

海耐射手 ⋅ 05/30 ⋅ 0

HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst ⋅ 05/29 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

苹果对体无完肤的 iOS 11 最后的弥补

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 距离万众瞩目的苹果开发者大会(WWDC 2018)的召开还有不到一周时间,苹果公司于今天凌晨,正式发布了 iOS 11 的第十四次更...

csdnnews ⋅ 05/30 ⋅ 0

iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 17分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 18分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 28分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 29分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 30分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 31分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 36分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 37分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 37分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 41分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部