字符串通过空测试,Returns null

String Passes Empty Test, Returns null

我正在测试以查看字符串是否存储在 NSUserDefaults 中。理论上,我认为以下是答案:

if ( ![[[NSUserDefaults standardUserDefaults] authorName] isEqual: @""] )
{
  NSLog(@"The default must be set, the string is not equal to empty.");
  NSString *authorName = [[NSUserDefaults standardUserDefaults] authorName];
}

实际上,它总是测试那里有什么东西,但当我尝试使用它时返回值“(null)”。谁能告诉我为什么?

最终,我想我已经解决了以下问题,但我不清楚为什么第一个测试用例没有像我预期的那样工作。

if ( [[[NSUserDefaults standardUserDefaults] authorName]  length] != 0 )

谢谢。

nil 字符串不等于空字符串。这就是为什么第一个测试通过但 returns nil - 因为如果没有存储值,NSUserDefaults 将 return nil。

将长度与零进行比较的原因是,在 objective-c 中对 nil 引用调用方法时,nil 是 returned。这与大多数其他语言不同,后者在这种情况下会抛出异常。因为长度是 NSInteger,所以 nil 变为零。

将长度与零进行比较应该是安全的,但您真正要测试的是默认情况下是否为给定键存储了一个字符串。在这种情况下,您可以简单地与 nil:

进行比较
if ([[NSUserDefaults standardUserDefaults] authorName] != nil)
{
    ....
}