关于[NSNull null]的一些混淆,没有

时间:2011-11-14 12:04:39

标签: iphone objective-c cocoa

  

可能重复:
  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。这是正确的和推荐的?

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。