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

Tha*_*nks 46 null cocoa cocoa-touch objective-c nsnull

这是我看到的上下文:

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

为什么不在那个地方零?

Mik*_*ron 81

直接来自Apple:

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

因此,在您的示例中,这正是发生的事情,程序员选择将空对象放入控制器数组中,其中nil不允许作为值.


hbw*_*hbw 12

您无法nilNSArray或添加值NSMutableArray.如果需要存储nil值,则需要使用NSNull包装类,如您所拥有的代码段所示.这在文档中指定.


Ros*_*one 9

集合类喜欢NSArrayNSDictionary不能包含nil值.NSNULL是专门为其创建的占位符nil.它可以放入集合类中,只占用空间.

NSNull定义一个单例对象,这意味着只有一个NSNull实例(你使用它创建[NSNull null]),但它可以在你想要的任意数量的地方使用.


Ham*_*123 8

我们都同意[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]");
Run Code Online (Sandbox Code Playgroud)

输出:

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]

  • ` - [NSObject isEqual:]`是将objc对象与NSNull进行比较的正确和推荐方法. (2认同)