[NSNull null]和nil有什么区别?

时间:2009-05-07 19:39:06

标签: objective-c cocoa-touch cocoa null nsnull

这是我见过的背景:

NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]];
}

为什么不在那个地方零?

6 个答案:

答案 0 :(得分:81)

直接来自Apple

  

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

所以在你的例子中,这正是发生的事情,程序员选择将一个空对象放入控制器数组中,其中nil不允许作为值。

答案 1 :(得分:11)

您无法向nilNSArray添加NSMutableArray值。如果您需要存储nil值,则需要使用NSNull包装类,如您所拥有的代码段所示。这在documentation

中指定

答案 2 :(得分:9)

NSArrayNSDictionary等集合类不能包含nil个值。 NSNULL专门创建为nil的占位符。它可以放入集合类,只占用空间。

NSNull定义了一个单例对象,这意味着只有一个NSNull实例(使用[NSNull null]创建),但它可以在任意多个地方使用。< / p>

答案 3 :(得分:7)

我们都同意[NSNull null]作为需要对象的占位符很有用,如上所述。但除非它明确用于你的对象的赋值,否则它不应该用于比较,这是我过去犯过的错误。

id a;
NSLog(@"Case 1");
if (a == nil) NSLog(@"a == nil");
if (a == Nil) NSLog(@"a == Nil");
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

NSLog(@"Case 2");
a = [NSNull null];
if (a == nil) NSLog(@"a == nil");
if (a == Nil) NSLog(@"a == Nil");
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

输出:

2014-01-31 10:57:11.179 MCDocsApp [13266:a0b]案例1

2014-01-31 10:57:11.179 MCDocsApp [13266:a0b] a == nil

2014-01-31 10:57:11.179 MCDocsApp [13266:a0b] a == Nil

2014-01-31 10:57:11.180 MCDocsApp [13266:a0b]案例2

2014-01-31 10:57:11.180 MCDocsApp [13266:a0b] a isEqual:[NSNull null]

答案 4 :(得分:0)

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

您无法将nil值添加到NSArray或NSMutableArray。如果需要存储nil值,则需要使用NSNull包装类。

NSArray和NSDictionary等集合类不能包含nil值。 NSNULL是专门为nil创建的占位符。它可以放入集合类中,只占用空间。

请参阅参考链接

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html

答案 5 :(得分:-12)

nil标记对象数组后数组的结尾...