OC中nil、Nil、NULL、NSNULL的一些区别
来源:互联网 发布:淘宝店铺流量突然下降 编辑:程序博客网 时间:2024/06/16 23:19
虽然我们平常接触的最多的是nil,但是如果对Nil、NULL、NSNULL、nil之间的还是傻傻分不清楚的话,没准哪天“阴沟里就翻船了”。(ps:其实我也是今天将这团乱麻理顺)
nil、Nil
nil在Swift中表示的是值缺失,而在OC中它所代表的是对象的指针不在指向系统为它所分配的内存空间,此时可以理解为创建的指针类型变量不再有所指的实体对象,即指针本身被干掉了,这个指针就不能再被使用了,而当对象实体没有被任何指针所指向时(此时的自动引用计数值为0),系统就可以回收那块没有任何用处的内存。而Nil则是表示是类对象(其实OC中类也是一种对象),与nil的作用类似。(ps:当使用if语句时,它们作为判断条件时的作用与0是相当的)
NULL
既然OC中已经用nil、Nil分别来表示对象和类的空指针(如果你对空指针进行操作,就会在运行时报出“经典的空指针异常”,区别于野指针,空指针异常是指发送消息给它没有任何问题,但不会得到有意义的执行),那么对于赋值(assign)类型的指针为空又如何表示呢?没错,就是NULL。其实NULL是一个符号常量,代表整数0。在stdio.h头文件中对NULL进行了定义:
#define NULL 0
对于指针变量值为NULL,可认为它的值为0。而与指针变量未赋值是不同的概念,后者表示的是它的值是一个无法预料的值,也就是说它可能指向一个事先为指定的单元,这是很危险的情况。所以在引用指针变量之前应对它赋值。
NSNULL
NSNULL它是一个OC类,它只能通过一个方法创建单例的对象,像这样:
NULL *null = [NSNULL NULL];
它主要用于创建集合中的空对象,常用作占位符。如果你想创建一个集合,当前某个索引暂时没有值,你可能就会用到它,比如在JSON的解析中。因为OC中的字典和数组只能存储对象,而JSON中可能存在null的值,所以就只能用NSNULL对象来表示。但是NSNULL无法像nil那样对所有的方法进行响应,当向NSNULL对象发送消息时,App就会崩溃。
总结
如果你想通过简单的赋值方式创建集合,那么添加到集合里面的元素一定不能有nil。使用nil同时也会影响OC对集合的计数,就像是C中对字符串的计数是以’\0’结束的一样,各位新手兄弟(ps:像我一样)可以自己试试。
写在后面的扩展资料<2016.10.2>
Mattt Thompson:nil / Nil / NULL / NSNull
参考:http://blog.csdn.net/xunyn/article/details/8283653
- OC中nil、Nil、NULL、NSNULL的一些区别
- [OC]nil、Nil、NULL、NSNull的区别
- OC 中 Nil nil NULL NSNull 的区别
- OC 中NULL nil和NSNULL的区别
- oc nil, Nil, NULL和NSNull的区别
- oc中,nil,Nil,NULL 和NSNull的小结
- OC 中nil,Nil,NULL,NSNull的含义
- OC中nil/Nil/NULL的区别
- OC中nil,Nil,NULL的区别
- iOS中nil/Nil/NULL的区别以及[NSNull null]
- iOS中nil、Nil、NULL、NSNull 区别
- iOS 中 nil NULL, NSNULL的区别
- Objective-c 中 nil, Nil, NULL和NSNull的区别
- Objective-c 中 nil, Nil, NULL和NSNull的区别
- Objective C中NULL、Nil、nil、NSNull 的区别
- Objective-c 中 nil, Nil, NULL和NSNull的区别
- Objective-c 中 nil, Nil, NULL和NSNull的区别
- Objective-c 中 nil, Nil, NULL和NSNull的区别
- 16. 3Sum Closest
- Android Studio出现UnsupportedClassVersionError Unsupported major.minor version 52.0
- 不使用构造方法创建Java对象 Objenesis
- 事务隔离性和锁的区别和联系
- 易流专线货运物流软件 V14.02 网络版
- OC中nil、Nil、NULL、NSNULL的一些区别
- webservice接口实现数据共享的实现的初步解决方案(更新、删除)
- iOS学习之iOS沙盒(sandbox)机制和文件操作
- 《Java源码分析》:HashSet
- hdu 5734 Acperience(2016 Multi-University Training Contest 2——化简公式,数学推导)
- POJ3641-Pseudoprime numbers
- ReentrantLock还是synchronized?
- Android 使用RxJava+Retrofit +Realm 组合加载数据 <读取缓存 显示 请求网络数据 缓存最新数据 更新界面>(二)
- 一个千万量级的APP使用的一些第三方库