74

我想知道nil,NIL和之间的区别null。我搜索了一下,发现了这个:

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

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

null-> 指向原始类型的空指针或没有数据

但我无法清楚地理解“Objective-C 对象”和“类”这两个术语。

请给我解释一下。另外,Objective-C 中是否有类似NSNullor的词?NSNil如果是这样,请解释它的用途。

4

6 回答 6

155

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

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

if (anotherObject == nil) // do something

Nil是 Objective-C 类的字面量 null 值,对应于 type 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];

至于NILor NSNil,Objective-C 或 Apple Foundation 中都没有这种东西。

于 2011-05-06T09:19:55.450 回答
7

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

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

于 2011-05-06T08:53:27.483 回答
7

Nil,Null 和 nil 与下面一起使用

1> Objective c 类的 Nil

2> 目标 c 对象的 nil

3> C 指针为空

例子:

1>A类=无;

2>NSString strName=nil;

3>char *pointerChar = NULL;

于 2014-02-19T06:35:00.943 回答
5

假设你有一个类,那么如果你想将它的实例初始化为空值(与java 中相同) ,则使用MyClass 约定,即nilnull

MyClass *obj = nil;


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

int *ptr = NULL; 


如果要初始化以Class引用空值(与nulljava 中相同),请使用

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以及in的定义_types.h

#define __DARWIN_NULL ((void *)0)

所以逻辑上没有区别。这里的主要思想是初始化一个指针,无论是C还是。如果你有知识,那么你可以分配Objective-C0C

int *ptr = 0;

没有类型转换0为指针。因为您无需进行类型转换0即可将其分配给指针。

简而言之,它们都是0,仅此而已。

于 2011-05-06T09:17:53.383 回答
4

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

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

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

http://nshipster.com/nil/

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

在此处输入图像描述

于 2014-09-10T09:03:56.393 回答
1

零,零和零。取决于您的要求。

NSNull

集合喜欢NSArray并且NSDictionary不能包含 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)0 Objective-C 对象的文字空值

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

于 2015-06-18T05:56:14.873 回答