gpt4 book ai didi

objective-c - 为什么对于未实现的方法,NSNull 的行为不像 nil?

转载 作者:行者123 更新时间:2023-12-04 04:44:39 24 4
gpt4 key购买 nike

据我了解,NSNull作为 nil 的替代品而存在在明确需要对象的情况下,例如 NSArrayNSDictionary集合。
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: NSObject的方法模仿 nil 的行为在无法识别的选择器上?

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

最佳答案

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

The NSNull class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).



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

另请注意 [NSNull null]是一个单例,因此您可以将其与 == 进行比较/ !=运算符而不是调用 isEqual:
if (name != [NSNull null] && [name isEqualToString:@"Gabriele"])

关于objective-c - 为什么对于未实现的方法,NSNull 的行为不像 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com