原文地址:http://blog.csdn.net/wzzvictory/article/details/18413519    感谢原作者

作者:wangzz

转载请注明出处
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢!
 
平时开发过程中经常遇到这几个表示空的关键字:nil、Nil、NULL,一向搞不清楚,作为一个有两年开发经验的程序员,连那么基础的东西都不知道未免太丢人了。
首先要说明的是,nil、Nil、NULL三个关键字和NSNull类都是表示空,只是用处不一样,具体的区别如下:

一、NULL

1、声明位置

stddef.h文件

2、定义

  1. #undef NULL
  2. #ifdef __cplusplus
  3. #  if !defined(__MINGW32__) && !defined(_MSC_VER)
  4. #    define NULL __null
  5. #  else
  6. #    define NULL 0
  7. #  endif
  8. #else
  9. #  define NULL ((void*)0)
  10. #endif
其中__cplusplus表示是不是C++代码,所以对于普通的iOS开发者来说,通常NULL的定义就是:

  1. #  define NULL ((void*)0)

因此,NULL本质上是:(void*)0

3、用处及含义

NULL表示C指针为空

4、示例

  1. charchar *string = NULL;
 

二、nil

1、声明位置

objc.h文件

2、定义

  1. #ifndef nil
  2. # if __has_feature(cxx_nullptr)
  3. #   define nil nullptr
  4. # else
  5. #   define nil __DARWIN_NULL
  6. # endif
  7. #endif
其中__has_feature(cxx_nullptr)用于判断C++中是否有nullptr特性,对于普通iOS开发者来说,nil的定义形式为:

  1. #   define nil __DARWIN_NULL

就是说nil最终是__DARWIN_NULL的宏定义,__DARWIN_NULL是定义在_types.h中的宏,其定义形式如下:

  1. #ifdef __cplusplus
  2. #ifdef __GNUG__
  3. #define __DARWIN_NULL __null
  4. #else /* ! __GNUG__ */
  5. #ifdef __LP64__
  6. #define __DARWIN_NULL (0L)
  7. #else /* !__LP64__ */
  8. #define __DARWIN_NULL 0
  9. #endif /* __LP64__ */
  10. #endif /* __GNUG__ */
  11. #else /* ! __cplusplus */
  12. #define __DARWIN_NULL ((void *)0)
  13. #endif /* __cplusplus */

非C++代码的__DARWIN_NULL最终定义形式如下:

  1. #define __DARWIN_NULL ((void *)0)

也就是说,nil本质上是:(void *)0

3、用处及含义

用于表示指向Objective-C中对象的指针为空

4、示例

  1. NSString *string = nil;
  2. id anyObject = nil;
 

三、Nil

1、声明位置

objc.h文件

2、定义

  1. #ifndef Nil
  2. # if __has_feature(cxx_nullptr)
  3. #   define Nil nullptr
  4. # else
  5. #   define Nil __DARWIN_NULL
  6. # endif
  7. #endif
和上面讲到的nil一样,Nil本质上也是:(void *)0

3、用处及含义

用于表示Objective-C类(Class)类型的变量值为空

4、示例

  1. Class anyClass = Nil;
 

四、NSNull

1、声明位置

NSNull.h文件

2、定义

  1. @interface NSNull : NSObject <NSCopying, NSSecureCoding>
  2. + (NSNull *)null;
  3. @end

3、用处及含义

从定义中可以看出,NSNull是一个Objective-C类,只不过这个类相当特殊,因为它表示的是空值,即什么都不存。它也只有一个单例方法+[NSUll null]。该类通常用于在集合对象中保存一个空的占位对象。

4、示例

我们通常初始化NSArray对象的形式如下:

当NSArray里遇到nil时,就说明这个数组对象的元素截止了,即NSArray只关注nil之前的对象,nil之后的对象会被抛弃。比如下面的写法:

  1. NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil,@"foogry"];

这是NSArray中只会保存wang和zz两个字符串,foogry字符串会被抛弃。

这种情况,就可以使用NSNull实现:

  1. NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",[NSNull null],@"foogry"];

五、总结

从前面的介绍可以看出,不管是NULL、nil还是Nil,它们本质上都是一样的,都是(void *)0,只是写法不同。这样做的意义是为了区分不同的数据类型,比如你一看到用到了NULL就知道这是个C指针,看到nil就知道这是个Objective-C对象,看到Nil就知道这是个Class类型的数据。

NULL, nil, Nil详解的更多相关文章

  1. Shell脚本 /dev/null 2>&1详解

    Shell脚本---- /dev/null 2>&1详解   1.可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. ...

  2. iOS中nil、Nil、NULL、NSNull详解(转)

    ObjC 里面的几个空值符号经常会差点把我搞死,这些基础的东西一点要弄清楚才行,以提高码农的基本素质. nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interfa ...

  3. iOS中nil、Nil、NULL、NSNull详解

    nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象. 例如: NSString *someString = nil; NSUR ...

  4. ECMAScript---布尔类型、null、undefined详解

    布尔类型中 至只有 true和false 在开发中它是非常重要的两个值,尤其是在条件判断中 如何把其他类型转换为布尔类型? 1.Boolean() Boolean(1); //true Boolean ...

  5. 关于Java中null的十点详解

    对于每一个Java程序员来说,null肯定是一个让人头痛的东西,连Java的发明者都承认这是一项巨大的设计失误,今天就来总结一下Java中关于null的知识. 1.null不属于任何类型,可以被转换成 ...

  6. 【Linux】/dev/null 2>&1 详解

     今天一个朋友突然在自己的维护的Linux中, /var/spool/cron/root 中看到了以下的内容: 30 19 * * * /usr/bin/**dcon.sh > /dev/nul ...

  7. Shell脚本———— /dev/null 2>&1详解

    1.可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和 ...

  8. shell之“>/dev/null 2>&1” 详解(转)

    今天在自己的一个技术群中又被问道了这么一个问题,于是又通俗的解释了一下,做个记录,大家看看解释是否清楚! shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以 ...

  9. /dev/null 2>&1 详解

     今天一个朋友突然在自己的维护的Linux中, /var/spool/cron/root 中看到了以下的内容: 30 19 * * * /usr/bin/**dcon.sh > /dev/nul ...

  10. shell里的/dev/null 2>&1详解

    shell中可能经常能看到: >/dev/null 2>&1 命令意思是:标准输出stdout 和标准错误输出stderr 也重定向到空设备文件,即不显示输出信息 分解这个组合:“ ...

随机推荐

  1. PHP获取客户端和服务器IP地址

    /** * 获取客户端IP地址 * @return string */ function get_client_ip() { if(getenv('HTTP_CLIENT_IP')){ $client ...

  2. 微信小程序的一些限制

    小程序的一些限制: 不支持HTML.没有 Dom.网页用的 JS.CSS 基本要全部重写,WXML 的语法和 HTML 差异还挺大,基本是一个个照着手册的属性去改.CSS 选择器不支持级联. 小程序源 ...

  3. ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb

    ArcGIS中文件共享锁定数据溢出 (2011-11-24 15:52:41) 转载▼ 标签: 杂谈 分类: GIS 文件共享锁定数溢出.(Error 3052)1. Access数据库,同时操作大量 ...

  4. 学习笔记_Filter小结(过滤器JavaWeb三大组件之一)

    Filter小结 Filter的三个方法: l  void init(FilterConfig):在Tomcat启动时被调用: l  void destroy():在Tomcat关闭时被调用: l  ...

  5. java对图片的裁剪(包括来自网络的图片)

    import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io. ...

  6. AVAudioSession 的 AVAudioSessionCategory 和 AVAudioSessionCategoryOptions 相关

    AVAudioSessionCategory相关 AVAudioSessionCategoryAmbient 使用这个category的应用会随着静音键和屏幕关闭而静音.并且不会中止其它应用播放声音, ...

  7. iOS开发——音频篇——音乐的播放

    一.简单说明 音乐播放用到一个叫做AVAudioPlayer的类,这个类可以用于播放手机本地的音乐文件. 注意: (1)该类(AVAudioPlayer)只能用于播放本地音频. (2)时间比较短的(称 ...

  8. Fxcop 初体验

    代码质量对于软件项目的成败很重要,这点我想大家都明白.那么在一个软件团队中如何保证代码质量呢?对于这个问题不同的人可能会有不同的答案,对于我而言我觉得做好两点代码质量基本就可以保证了: 1.代码规范( ...

  9. 数据结构与算法 - OC 实现

    [原创]http://www.cnblogs.com/luoguoqiang1985/ 冒泡排序:通过N-1次对剩余未排序元素中最大(小)元素的上浮来实现排序,上浮过程通过交换相邻元素实现. 选择排序 ...

  10. ZOJ 1025 Wooden Sticks(快排+贪心)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25 题目大意:机器运送n个木条,每个木条有一个长度和重量.运送第一根木 ...