我想知道nil
,NIL
和null
之间的区别。
我用Google搜索了一下,发现了这个:
nil
- >指向Objective-C对象的空指针
NIL
- >指向Objective-C类的空指针
null
- >指向原始类型或缺少数据的空指针
但我无法清楚地理解术语“Objective-C object”和“class”。
请向我解释一下。另外,Objective-C中是否有NSNull
或NSNil
这样的词?如果是,那么请解释它的用途。
答案 0 :(得分:146)
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
的单个实例是一个适当的对象。
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
或NSNil
,在Objective-C或Apple Foundation中没有这样的东西。
答案 1 :(得分:7)
我不确定,但我认为nil
只应用于代替id
,Java和C ++程序员会将pointer
视为object
}。将NULL
用于非对象指针。
nil
通常用于Objective-C对象类型,而NULL
用于c样式指针
答案 2 :(得分:7)
Nil,Null和nil用于以下
1>目标c类为零
2 - ;对于Objective c对象为零
3>空指针C指针
示例:强>
1> A类=无;
2> NSString strName = nil;
3> char * pointerChar = NULL;
答案 3 :(得分:5)
假设您有一个班级MyClass
然后按惯例使用nil
如果要将其实例初始化为null值(与java中的null
相同)
即
MyClass *obj = nil;
如果要将基本指针初始化为空值(与c相同),请使用
int *ptr = NULL;
如果你想初始化为Class
引用空值(与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)
__DARWIN_NULL
_types.h
的定义
#define __DARWIN_NULL ((void *)0)
所以逻辑上没有区别。这里的主要思想是初始化指针C
或Objective-C
到0
。如果您了解C
,那么您可以指定
int *ptr = 0;
没有将0
类型转换为指针。因为您不需要对0
进行类型转换以将其指定给指针。
0
,而不是其他任何东西。答案 4 :(得分:2)
这将帮助您理解nil,NIL和null之间的区别。
这三个值中的所有三个都表示null或零指针值。该 区别在于, NULL 表示任何指针的为零, nil 为 特定于对象(例如,id)和 Nil 特定于类指针。 应该将其视为使用正确null的最佳实践 即使在适当的情况下也可以用于文档目的 虽然没有什么可以阻止某人混合和匹配 他们一起去。
以下链接可能会以某种方式为您提供帮助:
以下是链接中的一些重要部分:
答案 5 :(得分:1)
nil,NIL和null。取决于你的要求。
<强> 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)Objective-C对象的0字面空值
Nil(Class)Objective-C类的0字面空值