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];