Objective-C中nil,NIL和null之间的差异

时间:2011-05-06 08:45:22

标签: objective-c null nsnull

我想知道nilNILnull之间的区别。 我用Google搜索了一下,发现了这个:

nil - >指向Objective-C对象的空指针

NIL - >指向Objective-C类的空指针

null - >指向原始类型或缺少数据的空指针

但我无法清楚地理解术语“Objective-C object”和“class”。

请向我解释一下。另外,Objective-C中是否有NSNullNSNil这样的词?如果是,那么请解释它的用途。

6 个答案:

答案 0 :(得分:146)

nil是Objective-C对象的文字空值,对应于抽象类型id或通过@interface声明的任何Objective-C类型。例如:

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

Nil是Objective-C类的文字空值,对应于类型Class。由于大多数代码不需要变量来引用类,因此它的使用并不常见。一个例子是:

Class someClass = Nil;
Class anotherClass = [NSString class];

NULL是任意C指针的文字空值。例如,

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNull是表示null的对象的类。实际上,只有一个对象,即+[NSNull null]返回的对象。它与nil不同,因为nil是一个文字空值,即它不是一个对象。另一方面,NSNull的单个实例是一个适当的对象。

NSNull通常用于Foundation集合,因为它们无法存储nil值。在字典的情况下,-objectForKey:返回nil以指示给定的密钥在字典中没有对应的对象,即,密钥尚未被添加到字典中。如果您想明确表示您拥有某个密钥但它还没有值,则可以使用[NSNull null]

例如,以下内容会引发异常,因为词典无法存储nil值:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

另一方面,以下代码有效,因为[NSNull null]是非nil对象:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

值得一提的是,Foundation集合的初始化程序使用nil作为对象列表末尾的标记,而无需指定列表中的元素数。这只会发生,因为nil无法存储在Foundation集合中。例如,

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

至于NILNSNil,在Objective-C或Apple Foundation中没有这样的东西。

答案 1 :(得分:7)

我不确定,但我认为nil只应用于代替id,Java和C ++程序员会将pointer视为object }。将NULL用于非对象指针。

nil通常用于Objective-C对象类型,而NULL用于c样式指针

答案 2 :(得分:7)

Nil,Null和nil用于以下

1>目标c类为零

2 - ;对于Objective c对象为零

3>空指针C指针

示例:

1> A类=无;

2> NSString strName = nil;

3> char * pointerChar = NULL;

答案 3 :(得分:5)

假设您有一个班级MyClass 然后按惯例使用nil如果要将其实例初始化为null值(与java中的null相同) 即

MyClass *obj = nil;


如果要将基本指针初始化为空值(与c相同),请使用

int *ptr = NULL; 


如果你想初始化为Class引用空值(与java中的null相同),那么使用

Class classRefOfMyClass = Nil;

这只是一个惯例,否则Nil或nil具有相同的含义,也许NULL,nil或Nil都是相同的。

以下是objc.h文件

中的定义
#ifndef Nil
# if __has_feature(cxx_nullptr)
#   define Nil nullptr
# else
#   define Nil __DARWIN_NULL
# endif
#endif

#ifndef nil
# if __has_feature(cxx_nullptr)
#   define nil nullptr
# else
#   define nil __DARWIN_NULL
# endif
#endif

并在stddef.h

#define NULL ((void*)0)

__DARWIN_NULL

_types.h的定义
#define __DARWIN_NULL ((void *)0)

所以逻辑上没有区别。这里的主要思想是初始化指针CObjective-C0。如果您了解C,那么您可以指定

int *ptr = 0;

没有将0类型转换为指针。因为您不需要对0进行类型转换以将其指定给指针。

简而言之,它们都是0,而不是其他任何东西。

答案 4 :(得分:2)

这将帮助您理解nil,NIL和null之间的区别。

  

这三个值中的所有三个都表示null或零指针值。该   区别在于, NULL 表示任何指针的为零, nil 为   特定于对象(例如,id)和 Nil 特定于类指针。   应该将其视为使用正确null的最佳实践   即使在适当的情况下也可以用于文档目的   虽然没有什么可以阻止某人混合和匹配   他们一起去。

以下链接可能会以某种方式为您提供帮助:

http://nshipster.com/nil/

以下是链接中的一些重要部分:

enter image description here

答案 5 :(得分:1)

nil,NIL和null。取决于你的要求。

<强> NSNull

NSArrayNSDictionary等集合无法包含nil值。

NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary];
MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey"
NSLog(@"Keys: %@", [mutableDictionary allKeys]);

<强>零

对象对其他对象的所有指针都以nil开头,因此在init方法中没有必要设置self。(association)= nil。

在其他语言中,如C ++,这会使程序崩溃,但在Objective-C中,在nil上调用方法会返回零值。

if (name != nil)
{
........
}

符号值含义

nil(id)Objective-C对象的0字面空值

Nil(Class)Objective-C类的0字面空值