您的位置:首页 > 其它

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 Thompsonnil / Nil / NULL / NSNull

参考:http://blog.csdn.net/xunyn/article/details/8283653
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC基础