OC中nil、Nil、NULL、NSNULL的一些区别
2016-07-22 16:19
288 查看
虽然我们平常接触的最多的是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
相关文章推荐
- Objective-C ---NSArray(梳理整理)
- Objective-C ---代理和协议 (梳理整理)
- Objective-C
- Object-C非正式协议与正式协议的区别
- 黑马程序员——OC基础学习(二)---对象方法和类方法的学习知识总结
- OC学习笔记-Objective-C概述和特点
- 5Foundation Kit 字典NSDictionary
- 4Foundation Kit2-NSArray NSEnumrator
- 字符串搜索的几种方法
- iOS开发学习_OC基础_(一).类、对象和方法(1)
- ||OC||OC语言基础知识框架结构//个人整理使用|仅供参考|尚未整理完
- 黑马程序员-OC语言-ios第二天笔记总结
- 黑马程序员-OC语言-ios第一天笔记总结
- 关于OC1-3课时知识点的查漏补缺
- 为什么retainCount返回的对象引用值总是跟预期的不一样呢?
- autorelease和release的差别
- oc学习笔记(不定时更新)
- 关于OC中成员变量,属性的一些基本知识(针对初学者)
- iOS开发基础:OC数组对象NSArray的常用方法
- 【编码风格】禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)