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

shw*_*eta 70 null objective-c nsnull

我想知道的区别nil,NILnull.我用Google搜索了一下,发现了这个:

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

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

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

但我无法清楚地理解术语"Objective-C对象"和"类".

请向我解释一下.此外,有没有像任何文字NSNullNSNil在Objective-C?如果是这样,那么请解释它的用途.

小智 150

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

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

if (anotherObject == nil) // do something
Run Code Online (Sandbox Code Playgroud)

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

Class someClass = Nil;
Class anotherClass = [NSString class];
Run Code Online (Sandbox Code Playgroud)

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

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;
Run Code Online (Sandbox Code Playgroud)

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

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

例如,以下引发异常,因为字典无法存储nil值:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
Run Code Online (Sandbox Code Playgroud)

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

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
Run Code Online (Sandbox Code Playgroud)

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

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
Run Code Online (Sandbox Code Playgroud)

至于NILor NSNil,在Objective-C或Apple Foundation中没有这样的东西.

  • 您还应该注意,可以在不出现分段错误的情况下将消息发送到"nil". (8认同)

vis*_*kh7 7

我不确定,但我认为nil只应该用来代替一个idJava和C++程序员会想到pointer的东西object.使用NULL非对象指针.

nil通常用于Objective-C对象类型,而NULL用于c风格的指针


Chr*_*lan 7

Nil,Null和nil用于以下

1>目标c级为零

2> nil为Objective c对象

3> N指向C指针

例:

1> A级=无;

2> NSString strName = nil;

3> char*pointerChar = NULL;


Ind*_*ore 5

假设您有一个类,MyClass 那么nil如果您想将其实例初始化为null值(与nulljava中相同),则使用按惯例

MyClass *obj = nil;
Run Code Online (Sandbox Code Playgroud)


如果你想初始化一个空值的基本指针(与c相同),你使用

int *ptr = NULL; 
Run Code Online (Sandbox Code Playgroud)


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

Class classRefOfMyClass = Nil;
Run Code Online (Sandbox Code Playgroud)

这只是一个约定,否则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
Run Code Online (Sandbox Code Playgroud)

并在 stddef.h

#define NULL ((void*)0)
Run Code Online (Sandbox Code Playgroud)

__DARWIN_NULLin 的定义_types.h

#define __DARWIN_NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)

所以逻辑上没有区别.这里的主要思想是初始化一个指针是否C还是Objective-C0.如果您有所了解,C那么您可以分配

int *ptr = 0;
Run Code Online (Sandbox Code Playgroud)

没有类型转换0为指针.因为您不需要进行类型转换0以将其分配给指针.

简而言之,他们都是,0而不是别的.

  • Java的`NULL`是小写的:`null` (2认同)

Mih*_*Oza 5

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

所有这三个值都表示空值或零指针值。不同之处在于,NULL对于任何指针都表示零, 而 nil特定于对象(例如 id),而Nil特定于类指针。 在正确的情况下使用正确的空对象以用于文档目的应该被认为是一种最佳实践,即使没有什么可以阻止人们在进行过程中进行混合和匹配。

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

http://nshipster.com/nil/

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

在此输入图像描述