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

Pat*_*ick 8 iphone cocoa objective-c

可能重复:
[NSNull null]和nil有什么区别?
nil,NULL和[NSNULL nil]之间有什么区别?

1.

id dicValue = [aDictionary objetForKey:@"aKey"];

if(dicValue != nil)
{
     blablala...
}
Run Code Online (Sandbox Code Playgroud)

要么

2.

if(dicValue != [NSNull null]) 
{
     blablala...
}
Run Code Online (Sandbox Code Playgroud)

我应该选择第一个还是第二个?

或者当它出现时:

3.

if ([aDictionary objetForKey:@"aKey"] != nil)
Run Code Online (Sandbox Code Playgroud)

要么

4.

if ([aDictionary objetForKey:@"aKey"] != [NSNull null])
Run Code Online (Sandbox Code Playgroud)

什么又一次?

1.2.3.4.这是正确的和推荐的?

Par*_*fna 18

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

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

重要的是要理解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"
Run Code Online (Sandbox Code Playgroud)

现在很清楚吗?