原文地址: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. android之自定义ViewGroup和自动换行的布局的实现

    viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上 找了下,没有相关的例子,但是找到了思路:自定义一个viewgr ...

  2. jQuery源代码学习笔记:构造jQuery对象

    2.1源代码结构: (function( window, undefined ) { var jQuery = (function() { // 构建jQuery对象 var jQuery = fun ...

  3. android87 Service

    ---------------------------------------------------------------------------- #Service(服务和Activity是运行 ...

  4. java 四种逻辑运算符

    在java的逻辑运算符中,有这么四类&&(短路与).&(与).||(短路或).|(非短路或) &&和&都表示与,&&表示第一个条件为fa ...

  5. Android 自定义View修炼-Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)

    一.概述 Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的.实现圆角图片的方法其实不少,常见的就是利用Xfermode,Shader.本文直接继 ...

  6. JVM内存模型及垃圾回收机制

    http://blog.csdn.net/zhangpengju999/article/details/11773183 JVM垃圾回收机制 分代垃圾回收 不同的对象生命周期不同.与业务信息有关的对象 ...

  7. 20160314 Request 和Response

    一.Response 1.Resonse的继承结构: ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容 ...

  8. PHP mysql_real_escape_string() 函数防SQL注入

    PHP MySQL 函数 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符. 下列字符受影响: \x00 \n \r \ ' &quo ...

  9. php 5.3 配置mssql笔记

    参考URL  https://docs.moodle.org/29/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Debian_Lenny 第一步,下载相应 ...

  10. iOS控件——UIView的viewWithTag:(int)findTag方法描述

    UIView拥有一个viewWithTag:(int)findTag方法,调用方式为[MyView viewWithTag:整形数字]该方法返回tag == findTag的控件.ios控件中允许多个 ...