2

根据我的理解,在明确需要对象的情况下(例如在和集合中)NSNull存在替代。nilNSArrayNSDictionary

的行为的优点之一是可以跳过nil许多详细检查,并且可以方便地实现相同的行为。考虑以下示例:nullNSNull

NSDictionary * json = // deserialized JSON from a REST service
NSString * name = json[@"first_name"];
if (name != nil && ![name isEqual:[NSNull null]] && [name isEqualToString:@"Gabriele"]) { ... }

该检查目前可以简化为

if (![name isEqual:[NSNull null]] && [name isEqualToString:@"Gabriele"]) { ... }

但如果[NSNull null] 模仿 的行为nil,则可以进一步简化为

if ([name isEqualToString:@"Gabriele"]) { ... }

所以我的问题是,为什么 Apple 不覆盖模仿无法识别的选择器行为的-forwardInvocation:方法?NSObjectnil

我想了解它背后的哲学,并了解是否存在一些我无法想到的缺点或一些违反惯例。

4

1 回答 1

3

我的理解是,它nil的行为是 Objective C 语言的一部分,而不是任何特定库的一部分。NSNull另一方面,它是库的一部分,具有一个非常特定的目的:

该类NSNull定义了一个单例对象,用于表示集合对象中的空值(不允许nil值)。

它不打算用作“哨兵”对象:如果您希望构造这样的对象,您总是可以这样做,因为集合本身并没有赋予NSNull任何特殊意义。它是为了方便程序员在希望存储nils 的情况下提供的,这样程序员就可以避免在每次需要时重新发明自己的 null 对象。

另请注意,这[NSNull null]是一个单例,因此您可以将其与==/!=运算符进行比较,而不是调用isEqual:

if (name != [NSNull null] && [name isEqualToString:@"Gabriele"])
于 2013-08-22T13:55:37.783 回答