可能重复:
What's the difference between [NSNull null] and nil?
What are the differences between nil, NULL and [NSNULL nil]?
1
id dicValue = [aDictionary objetForKey:@"aKey"];
if(dicValue != nil)
{
blablala...
}
或
2
if(dicValue != [NSNull null])
{
blablala...
}
我应该选择第一个还是第二个?
或者是这样的:
3
if ([aDictionary objetForKey:@"aKey"] != nil)
或
4
if ([aDictionary objetForKey:@"aKey"] != [NSNull null])
还有什么?
1.2.3.4。这是正确的和推荐的?
答案 0 :(得分:18)
直接来自Apple Documentation。
NSNull类定义了一个单例对象,用于在禁止nil作为值的情况下(通常在集合对象(如数组或字典)中)表示空值。
NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
// output: "arrayWithNull: (<null>)"
重要的是要理解NSNull实例在语义上与NO或false不同 - 这两者都代表逻辑值; NSNull实例表示缺少值。 NSNull实例在语义上等同于nil,但是理解它不等于nil也很重要。因此,要测试空对象值,必须进行直接对象比较。
id aValue = [arrayWithNull objectAtIndex:0];
if (aValue == nil) {
NSLog(@"equals nil");
} else if (aValue == [NSNull null]) {
NSLog(@"equals NSNull instance");
if ([aValue isEqual:nil]) {
NSLog(@"isEqual:nil");
}
}
// output: "equals NSNull instance"
现在是否清楚??
答案 1 :(得分:3)
我的理解是NSNull是一个表示NULL值的对象,而nil只是一个空指针。
您可以使用NSNull对象填充NSArray并且它将返回空值,但是您无法用nils填充它。
你可以做到
[myNsMutableArray addObject:[NSNull null]];
但这会崩溃:
[myNsMutableArray addObject:nil];
同样地:
[[NSMutableArray alloc] initWithObjects:@"1", nil, @"2", nil];
[[NSMutableArray alloc] initWithObjects:@"1", [NSNull null], @"2", nil];
第一个数组,打印时会输出“1” 第二个输出:“1,null,2”
因此,您可以使用NSNull来表示数组中的空格。
您无法将nil插入字典中。因此检查它意味着密钥不存在。如果检查NSNull,则表示密钥存在但保留空(NSNull)值。
答案 2 :(得分:1)
第一个意味着没有这样的密钥,第二个意味着密钥的值是NSNull
答案 3 :(得分:0)
在这种情况下,你应该使用第一个;或者更确切地说,稍有不同:
if (dicValue) {
// blablabla...
}
NSNull
用于需要有效对象时,例如用作字典键,数组条目或类似对象。
nil
等于(id)NULL
;它通常被认为是“没有价值”。
[NSNull null]
是一个持有空值的对象;用来表示“无值”。
很少有方法返回NSNull
值,通常只有在您自己引入它时才会遇到。
它的存在主要是因为nil
无法插入数组中;并作为需要它的数组的空标记。
相关说明;你表达的“!= nil
”部分是多余的;对象的任何有效指针在布尔表达式中的计算结果为true,而nil的计算结果为false。