关于nil,Nil,NULL, null和NSNULL完全解读

在OC涉及到对空值的处理中,有以下几种表示空的关键字,相关解释:

nil -> Null-pointer to objective- c object
//表示一个指向OC对象的空指针
Nil -> Null-pointer to objective- c class
//表示一个OC类空指针(在Foundation/NSObjCRuntime.h被定义中)

NULL->(在c中的解释)The macro NULL is defined in <stddef.h> 
(and other headers) as a null pointer constant
//即 NULL 是一个标准规定的宏定义,用来表示空指针常量。
(在OC中的解释)null pointer to primitive type or absence  of data
//指的是一般的基础数据类型为空,可以给任意的指针赋值。本质就是(void *)0,
是C指针的字面0值。

NSNull -> NSNull class represent “no object” in a collection
//在一个集合(NSArray/NSSet等)中表示无对象、无值

NULL的解释来自cnblog博主有心故我在的博客:c语言NULL和0区别及NULL详解
NSNull的解释来自Xcode自带的开发文档搜索关键字
原文如下:

Using NSNull
The NSNull class defines a singleton object you use to represent null values in situations where nil is prohibited as a value (typically in a collection object such as an array or a dictionary).

It is important to appreciate that the NSNull instance is semantically different from NO or false—these both represent a logical value; the NSNull instance represents the absence of a value. The NSNull instance is semantically equivalent to nil, however it is also important to appreciate that it is not equal to nil. To test for a null object value, you must therefore make a direct object comparison.
翻译:
NSNull用法:
NSNull类定义一个单例对象,在禁止使用nil表示空值的时候使用(在集合对象例如数组和字典)
更重要的是要意识到NSNull的实例在语法上不同于NO和false---这两种表示不同的逻辑值,儿NSNull实例表示一个空值.NSNull实例在语法上等同于nil,然而同样重要的是要意识到它,不等于nil,为了测试空对象值,您必须进行直接对象比较。
代码如下:

id aValue = [arrayWithNull objectAtIndex:0];
if (aValue == nil) {
    NSLog(@"equals nil");
}
else if (aValue == [NSNull null]) {
    NSLog(@"equals NSNull instance");
    if ([aValue isEqual:nil]) {
        NSLog(@"isEqual:nil");
    }
}
// Output: "equals NSNull instance"

在搜索期间还有其他关于空指针的相关解释

Null Pointers
In Objective-C, a pointer type declaration can use the _Nullable and _Nonnull annotations to specify whether or not that pointer may have a nil or NULL value. In Swift, a null pointer is represented by a 'nil' value of an optional pointer type. Pointer initializers taking the integer representation of an address in memory are failable. A non-optional pointer type cannot be assigned a nil value.
翻译:
在OC中,在声明一个指针类型的时候可以用_Nullable和_Nonull注释去指明是否这个指针可以为nil或NULL值.在swift中,nil只能在可选指针类型的值中表示空值.指针初始化时,会在内存中给一个表示整型的可失败的地址.一个非可选值类型的指针不能被分配为nil值.

用法上:

NSURL *url = nil;
Class  class = Nil;
int *pointerInt = NULL;//(NULL给任何指针赋值,NULL和nil不能互换)
NSNull的用法
eg1:
      [dict setObject:[NSNull null] forKey:@"someKey"];\
eg2:

  for (id object in array) {
        if (object == [NSNull null]) {
            NSLog(@"Found a null object");
        }
    }

在整理期间借鉴很多博客 ,其中也有关于nil的判断问题也有很好的解释,我觉得也是为什么整理这个空值相关的简书的原因之一 ----程序员的天职,就是判断所有可能出现错误的情况并处理

出自北辰明关于OC中的nil, NULL详解
在使用一个对象之前判断它是否为nil是一个很好的习惯,个人觉得有两个原因:
1.降低时间复杂度(感觉可以这么说吧),如果你增加了nil的判断,那么不需要对空指针发送消息了,发消息其实是件费时的操作。详情可以看这里
2.把判断为空养成习惯其实是好事,这样在你切换语言时也不容易出错。

标志------ 值 ------------含义
NULL |--- | (void *)0| ------C指针的字面零值
nil ------- | (id)0|---------- Objective-C对象的字面零值
Nil--------|(Class)0|-------Objective-C类的字面零值
NSNull----|[NSNull null]|---用来表示零值的单独的对象

写在最后:

个人觉得整理简书的真正意义在与发现更多整理标题之外的相关知识如果仅仅知识看别人的博客其实也是可以知道自己要查的知识点的,但是真正自己整理的时候才会发现,其实还是有差别的.
比如这次整理时,发现的一个杂志:
NSHipster is a journal of the overlooked bits in Objective-C, Swift, and Cocoa. Updated weekly.
NSHpster中文版关注被忽略的 Objective-C、Swift 和 Cocoa 特性。每周更新。
好像是已经停止更新了,但上面有很多知识点的讲解很亲民.觉得能看一阵子.里面有很多我们<a>常用的但还不明白的知识点</a>.
个人也是有一个愿望,那就是希望中国的程序员开发社区的大神们,能够多发帖子分享自己的技术,让这些想在IT行业初来乍到的新人能有更多方便,在中国做程序员,竞争力是有的,但是无私的讲,分享还是能够加快中国IT行业的发展的,真心希望中国互联网,能够快速发展吧;而九个人而言我觉得分享也能给自己一个整理和重新思考的过程,对自己的技术我觉得也不免是一种提高吧!

由于写本文时,本人还并没有足够的开发经验,不足之处望批评指正!
我的理想是-----------共同进步!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容