我想知道nil
,NIL
和null
之间的区别。我用谷歌搜索了一下,发现了这个:
指向Objective-C对象的nil
->空指针
指向Objective-C类的NIL
->空指针
指向基元类型或缺少数据的null
->空指针
但是我不能清楚地理解"Objective-C对象“和”类“这两个术语。
请给我解释一下。另外,在Objective-C中有像NSNull
或NSNil
这样的词吗?如果是这样的话,请解释一下它的用途。
发布于 2011-05-06 17:19:55
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
的单个实例是一个适当的对象。
由于基础集合不能存储nil
值,因此经常在基础集合中使用NSNull
。对于字典,-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"];
值得一提的是,基础集合具有初始化器,这些初始化器使用nil
作为对象列表末尾的标记,而不必指定列表中元素的数量。这只会发生,因为nil
不能存储在基础集合中。例如,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
至于NIL
或NSNil
,Objective-C或Apple Foundation中没有这样的东西。
发布于 2011-05-06 16:53:27
我不确定,但我认为nil
应该只用来代替id
,Java和C++程序员会认为它是object
的pointer
。将NULL
用于非对象指针。
nil
通常用于Objective-C对象类型,而NULL
则用于c风格的指针
发布于 2011-05-06 17:17:53
假设您有一个类MyClass
,那么按照惯例,如果您想将其实例初始化为空值(与java中的null
相同),则使用nil
。
MyClass *obj = nil;
如果您想要将原始指针初始化为null值(与c中的相同),则可以使用
int *ptr = NULL;
如果您希望将Class
引用初始化为null值(与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)
以及_types.h
中__DARWIN_NULL
的定义
#define __DARWIN_NULL ((void *)0)
所以在逻辑上没有区别。这里的主要思想是初始化一个指向0
的指针,无论是C
还是Objective-C
。如果您了解C
,那么您可以指定
int *ptr = 0;
而不是将0
类型转换为指针。因为您不需要类型转换0
来将其赋值给指针。
简而言之,它们都是0
,没有别的。
https://stackoverflow.com/questions/5908936
复制相似问题