objective-C nil,Nil,NULL之间的不同
Posted xiaoqiangink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了objective-C nil,Nil,NULL之间的不同相关的知识,希望对你有一定的参考价值。
在看书的时候突然看到一个问题,就是关于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];
以上是关于objective-C nil,Nil,NULL之间的不同的主要内容,如果未能解决你的问题,请参考以下文章
objective-C nil,Nil,NULL 和NSNull的小结