objective-C nil,Nil,NULL之间的不同

86540698 2020-04-08

在看书的时候突然看到一个问题,就是关于nil,Nil,NULL有什么不同,怎么使用?

查了一下,在stack overflow上面看到一个很nice的解释,翻译记录一下下。

nil

首先,nil是指一个OC对象的空值表达,如下:

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // do something

Nil

而Nil则是对于OC Class的空值表达,一般不太会涉及到用一个变量来引用Class,所以,不是很常用。

Class someClass = Nil;
Class anotherClass = [NSString class];

NULL

NULL是对任意C 指针的空值表达。

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNull

NSNull是代表一个空值对象的类,意思是,在Class中,返回+ [NSNull null]的那个对象。

它和nil是不同的,因为nil是字面空值,也就是说,nil不是一个对象。

对于single instance来说,NSNull 它可以被看作是一个对象。

NSNull经常用于Foundation集合中因为它们不能存储空值,对于字典,objectForKey: 返回ni意味着给定的键值在字典中没有对应的对象,即,该key值还没有被添加到字典中。

如果关于某个key还没有值,但你想明确表达出来,可以使用[NSNull null]。

下面的表达是违法的,字典中对象不能为nil

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

下面是有效的,前面说过,NSNull可以被看作是一个对象。

NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];
[dict1 setObject:[NSNull null] forKey:@"someKey"];
NSLog(@"dic %@",dict1);
--
dic {
  someKey = "<null>";
}

值得一提的是,Foundation集合的初始化动作使用nil作为对象列表结尾的标记,而不必指定列表中元素的数量。这种情况是因为nil无法存储在Foundation集合中。例如,

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

相关推荐