为什么NSNull对未实现的方法的行为不像nil?

时间:2013-08-22 13:48:42

标签: objective-c nsnull

根据我的理解,在NSNullnil集合中明确需要对象的情况下,NSArray可替代NSDictionary

nil行为的一个优点是可以跳过许多详细的null检查,并且NSNull实现相同的行为会很方便。请考虑以下示例:

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:的{​​{1}}方法来模仿NSObject对无法识别的选择器的行为?

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

1 个答案:

答案 0 :(得分:3)

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

  

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

它不能用作“哨兵”对象:如果你想构造这样一个对象,你总是可以这样做,因为集合本身不会赋予NSNull任何特定的意义。它为程序员在希望存储nil的情况下提供方便,以便程序员可以避免在每次需要时重新发明自己的null对象。

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

if (name != [NSNull null] && [name isEqualToString:@"Gabriele"])