1

我有以下代码:

NSString *content = [[NSUserDefaults standardUserDefaults] stringForKey:@"mykey"];
NSLog(@"string is %@",content);
if ([content stringIsEmpty]){
   NSLog(@"empty string");
}else{
  NSLog(@"string is not empty");
}

stringIsEmpty 是类类别NSString

- (BOOL ) stringIsEmpty {
    if ((NSNull *) self == [NSNull null]) {
        return YES;
    }
    if (self == nil) {
        return YES;
    } else if ([self length] == 0) {
        return YES;
    }
    return NO;
}

输出是:

string is (null)
string is not empty

它怎么可能同时为空而不为空?

4

3 回答 3

3

会发生什么:

[content stringIsEmpty:YES]

将返回 false ( NO),当contentnil. 所以你的代码将采用

 NSLog(@"string is not empty");

分支。这会更好:

if (content && [content stringIsEmpty:YES]){
    ...

更好的方法是反转方法的语义:

if ([content stringIsNotEmpty]) {

这会很好地工作,因为contentnil什么时候会返回NO,当它不是时nil,它会执行你的方法。

编辑:

在 Objective-C 中,向 发送消息nil是合法的,并且根据定义将评估为nil. 谷歌“目标 c 向零发送消息”。

在另一种语言 (C++) 中,您的代码会崩溃(实际上是未定义的行为,但为了简单起见)。

于 2013-01-27T11:00:06.347 回答
1

我使用一个小函数来测试空虚。它不仅仅适用于字符串:

static inline BOOL isEmpty(id thing) {
    return thing == nil
        || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
        || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}

我通常将它导入到我的 pch 文件中 - 你可以看到它以及归属:https ://gist.github.com/325926

正如@sergio 已经指出的那样——当你的字符串是nil你不能向它发送消息来测试它是否为 nil 时——因为向 nil 发送消息对 void 方法没有任何作用,并在方法返回某些东西的地方返回 nil 。

您正在使用参数调用您的方法

if ([content stringIsEmpty:YES])

但是您的方法声明不需要一个:

- (BOOL ) stringIsEmpty {

那是怎么回事?

于 2013-01-27T11:06:49.603 回答
0

您必须在方法之外检查 'content == nil' 情况。

如果您希望能够只调用一个方法,请将方法更改为测试肯定的方法,例如“stringHasContent”,返回YESif self.length > 0

于 2013-01-27T11:50:11.147 回答