我想知道nil
,NIL
和之间的区别null
。我搜索了一下,发现了这个:
nil
-> 指向 Objective-C 对象的空指针
NIL
-> 指向 Objective-C 类的空指针
null
-> 指向原始类型的空指针或没有数据
但我无法清楚地理解“Objective-C 对象”和“类”这两个术语。
请给我解释一下。另外,Objective-C 中是否有类似NSNull
or的词?NSNil
如果是这样,请解释它的用途。
我想知道nil
,NIL
和之间的区别null
。我搜索了一下,发现了这个:
nil
-> 指向 Objective-C 对象的空指针
NIL
-> 指向 Objective-C 类的空指针
null
-> 指向原始类型的空指针或没有数据
但我无法清楚地理解“Objective-C 对象”和“类”这两个术语。
请给我解释一下。另外,Objective-C 中是否有类似NSNull
or的词?NSNil
如果是这样,请解释它的用途。
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];
至于NIL
or NSNil
,Objective-C 或 Apple Foundation 中都没有这种东西。
我不确定,但我认为nil
应该只用来代替id
.Java 和 C++ 程序员认为pointer
的object
. 用于NULL
非对象指针。
nil
通常用于 Objective-C 对象类型,而NULL
用于 c 样式指针
Nil,Null 和 nil 与下面一起使用
1> Objective c 类的 Nil
2> 目标 c 对象的 nil
3> C 指针为空
例子:
1>A类=无;
2>NSString strName=nil;
3>char *pointerChar = NULL;
假设你有一个类,那么如果你想将它的实例初始化为空值(与java 中相同) ,则使用MyClass
约定,即nil
null
MyClass *obj = nil;
如果您想将原始指针初始化为空值(与 c 中相同),您可以使用
int *ptr = NULL;
如果要初始化以Class
引用空值(与null
java 中相同),请使用
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-C
0
C
int *ptr = 0;
没有类型转换0
为指针。因为您无需进行类型转换0
即可将其分配给指针。
0
,仅此而已。这将帮助您了解 nil、NIL 和 null 之间的区别。
所有这三个值都表示空值或零指针值。不同之处在于,NULL表示任何指针的零,而 nil特定于对象(例如,id),而Nil特定于类指针。 出于文档目的,在正确的情况下使用正确的空对象应该被认为是一种最佳实践,即使没有什么可以阻止某人在进行过程中进行混合和匹配。
以下链接可能会以某种方式帮助您:
以下是链接中的一些重要部分:
零,零和零。取决于您的要求。
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 类的文字空值