2011-11-14 35 views
8

可能重复:
What's the difference between [NSNull null] and nil?
What are the differences between nil, NULL and [NSNULL nil]?一些关于[NSNull空]的混淆,零

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。这是正确的,并建议?

回答

18

直接从Apple Documentation
NSNull类定义了一个单例对象,用于在nil被禁止作为值(通常位于集合对象(如数组或字典)中)的情况下表示空值。

NSNull *nullValue = [NSNull null]; 
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue]; 
NSLog(@"arrayWithNull: %@", arrayWithNull); 
// output: "arrayWithNull: (<null>)" 

重要的是要明白,NSNull实例在语义上不同于NO或假 - 这些都表示一个逻辑值; 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" 

现在清楚了吗?

+0

的那种,谢谢! – Patrick

+0

这帮了太多的谢谢!正在寻找比较运营商所有的SO – Jake

0

在这种情况下,您应该使用第一个;或者说,一个微小的变化:

if (dicValue) { 
    // blablabla... 
} 

NSNull是用于当你需要一个有效的对象,例如用作字典的键,数组项,或类似的。

nil等于(id)NULL;它通常被认为是“没有价值”。

[NSNull null]另一方面,它是一个空值的对象;意思是“无价值”。

很少有方法会返回NSNull值,而且通常只有在您自己介绍时才会遇到。

它的存在主要是因为nil无法插入到数组中;并作为需要它的数组的空标记。


在相关说明;您的表情的“!= nil”部分是多余的;任何指向对象的有效指针都会在布尔表达式中求值为true,并且nil的计算结果为false。

+0

3q,我知道它是多余的,但我仍然喜欢添加“!= nil”部分。它使代码易于阅读!你认为是这样:) – Patrick

1

第一个表示不存在这样的键,第二意味着键值为NSNull

+0

这很清楚,3q! – Patrick

3

我的理解是,NSNull是代表NULL值的对象,零只是一个空指针。

你可以用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)值。

+0

3q,这有助于很多! – Patrick

+0

我很高兴它。接受答案然后:) – Odrakir