根据我的理解,在NSNull
和nil
集合中明确需要对象的情况下,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
对无法识别的选择器的行为?
我想了解它背后的哲学,并了解是否存在一些我无法想到的缺点或一些破坏的惯例。
答案 0 :(得分:3)
我的理解是nil
的行为是Objective C语言的一部分,而不是任何特定库的一部分。另一方面,NSNull
是图书馆的一部分,只有一个非常具体的目的:
NSNull
类定义了一个单例对象,用于表示集合对象中的空值(不允许nil
值)。
它不能用作“哨兵”对象:如果你想构造这样一个对象,你总是可以这样做,因为集合本身不会赋予NSNull
任何特定的意义。它为程序员在希望存储nil
的情况下提供方便,以便程序员可以避免在每次需要时重新发明自己的null对象。
另请注意[NSNull null]
是单身,因此您可以将其与==
/ !=
运算符进行比较,而不是调用isEqual:
if (name != [NSNull null] && [name isEqualToString:@"Gabriele"])