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

这是我看到的背景:
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]];
}
为什么不在那个地方零?     
已邀请:
直接来自Apple:   NSNull类定义了一个单例对象,用于在禁止nil作为值(通常在集合对象(如数组或字典)中)的情况下表示空值。 所以在你的例子中,这正是发生的事情,程序员选择将一个空对象放入控制器数组中,其中nil不允许作为值。     
您不能将
nil
值添加到
NSArray
NSMutableArray
。如果您需要存储
nil
值,则需要使用
NSNull
包装类,如您所拥有的代码段所示。这在文档中指定。     
NSArray
NSDictionary
这样的集合类不能包含
nil
值。
NSNULL
是专门为
nil
创建的占位符。它可以放入集合类中,只占用空间。
NSNull
定义了一个单例对象,这意味着只有一个NSNull实例(使用
[NSNull null]
创建),但它可以在任意多个地方使用。     
我们都同意[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 ==无 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]     
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     
nil标记对象数组后数组的结尾...     

要回复问题请先登录注册