什么是(null)的适当测试?

时间:2012-09-10 23:27:57

标签: objective-c cocoa-touch uipickerview

在我的代码中,我使用此测试来检查用户是否在pickerView中选择了某些内容:

if ( !selection || [selection isEqualToString:@"Select..."] ) {}

但是,Stack Overflow上的很多帖子建议使用NSNull或类似下面的示例测试:

if ( selection.length == 0 || [selection isEqualToString:@"(null)"] ) {}

上面的代码行中还有许多变体都在测试我正在使用的null:!selection

我的测试是否不完整,是否容易陷入错误? !selection和其他测试之间有什么区别?

3 个答案:

答案 0 :(得分:2)

selection.length == 0

如果你想将零长度字符串和nil视为同一个东西,这是很好的,通常就是这种情况。因为将消息发送到nil对象是安全的,结果将是nil,0或0.0,所以你可以安全地执行此操作。

你只需要使用isEqualToString:你有其他可能的字符串要等同于nil,例如@“(null)”,我看到在某种Object图中转换文本数据时会发生这种情况,我有时会在JSON中看到这一点,其中生成JSON的代码无法正确处理null。

NSNull是一个对象,你可能必须测试它,如果你可能得到NSNull的实例代替nil,这会发生在很多JSON解析器中。它也是一种在集合对象(NSArray和NSDictionarys)中存储nil的方法

答案 1 :(得分:1)

我唯一可以预见的错误是本地化错误。如果您使用NSLocalizedString()在某处设置选取器数据,并忘记根据当前的本地化正确检查@"Select...",该怎么办?这将非常烦人,特别是如果您的测试人员没有彻底测试所有本地化......

但是,!selectionselection.length == 0都应该都可以,即使选择nilnil.length也没有意义......所以,我请说:

if ( !selection || [selection isEqualToString:@"(null)"] ) {}

答案 2 :(得分:1)

首先,您需要了解nil,NSNull和NULL之间的区别。

nil - (id)0表示未初始化的id个对象,但由于逻辑不能在某些模式中使用,例如您无法将nil值添加到数组中。

NSNull - 用于初始化nil表示的单例类 - 您可以将其添加到数组中。

NULL - (void *)0,表示任何未初始化的对象,它必须在那里用于向后C支持

对于初始化检查,我通常使用宏(obj != nil) && (obj != (id)[NSNull null])

对于空字符串检查,您可以使用

((obj != nil) && (obj != (id)[NSNull null]) && obj.length > 0 && [obj containsOnlyWhitespaceOrNewline] == NO)