关于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  
(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 特性。每周更新。
好像是已经停止更新了,但上面有很多知识点的讲解很亲民.觉得能看一阵子.里面有很多我们常用的但还不明白的知识点.
个人也是有一个愿望,那就是希望中国的程序员开发社区的大神们,能够多发帖子分享自己的技术,让这些想在IT行业初来乍到的新人能有更多方便,在中国做程序员,竞争力是有的,但是无私的讲,分享还是能够加快中国IT行业的发展的,真心希望中国互联网,能够快速发展吧;而九个人而言我觉得分享也能给自己一个整理和重新思考的过程,对自己的技术我觉得也不免是一种提高吧!

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

你可能感兴趣的:(关于nil,Nil,NULL, null和NSNULL完全解读)