首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Objective-C中nil、NIL和null的区别

Objective-C中nil、NIL和null的区别
EN

Stack Overflow用户
提问于 2011-05-06 16:45:22
回答 3查看 33.3K关注 0票数 73

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

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

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

指向基元类型或缺少数据的null ->空指针

但是我不能清楚地理解"Objective-C对象“和”类“这两个术语。

请给我解释一下。另外,在Objective-C中有像NSNullNSNil这样的词吗?如果是这样的话,请解释一下它的用途。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-06 17:19:55

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

代码语言:javascript
复制
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

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

代码语言:javascript
复制
Class someClass = Nil;
Class anotherClass = [NSString class];

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

代码语言:javascript
复制
int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

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

由于基础集合不能存储nil值,因此经常在基础集合中使用NSNull。对于字典,-objectForKey:返回nil,表示给定的键在字典中没有对应的对象,即该键还没有添加到字典中。如果你想明确表示你有一个特定的键,但是它还没有值,你可以使用[NSNull null]

例如,下面的代码引发异常,因为字典不能存储nil值:

代码语言:javascript
复制
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

另一方面,由于[NSNull null]是一个非nil对象,因此以下代码是有效的:

代码语言:javascript
复制
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

值得一提的是,基础集合具有初始化器,这些初始化器使用nil作为对象列表末尾的标记,而不必指定列表中元素的数量。这只会发生,因为nil不能存储在基础集合中。例如,

代码语言:javascript
复制
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

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

票数 154
EN

Stack Overflow用户

发布于 2011-05-06 16:53:27

我不确定,但我认为nil应该只用来代替id,Java和C++程序员会认为它是objectpointer。将NULL用于非对象指针。

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

票数 7
EN

Stack Overflow用户

发布于 2011-05-06 17:17:53

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

代码语言:javascript
复制
MyClass *obj = nil;

如果您想要将原始指针初始化为null值(与c中的相同),则可以使用

代码语言:javascript
复制
int *ptr = NULL; 

如果您希望将Class引用初始化为null值(与java中的null相同),那么可以使用

代码语言:javascript
复制
Class classRefOfMyClass = Nil;

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

下面是在objc.h文件中对它们的定义

代码语言:javascript
复制
#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

代码语言:javascript
复制
#define NULL ((void*)0)

以及_types.h__DARWIN_NULL的定义

代码语言:javascript
复制
#define __DARWIN_NULL ((void *)0)

所以在逻辑上没有区别。这里的主要思想是初始化一个指向0的指针,无论是C还是Objective-C。如果您了解C,那么您可以指定

代码语言:javascript
复制
int *ptr = 0;

而不是将0类型转换为指针。因为您不需要类型转换0来将其赋值给指针。

简而言之,它们都是0,没有别的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5908936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档