类别判断字符串是否为空不起作用

时间:2018-09-26 09:38:03

标签: objective-c

我写了一个NSString 类别来判断一个字符串是否为空字符串:

- (BOOL)isEmptyString {
    if ([self isEqual:[NSNull null]] || self == NULL || self == nil || [self isEqualToString:@""] || self.length == 0)
    {
        return YES;
    }
    return NO;
}

但是,当字符串为零字符串时,返回NO

NSString *a = nil;
if ([a isEmptyString]) {
    NSLog(@"is empty");
} else {
    NSLog(@"not empty");
}
  

控制台打印为“非空”。

为什么返回NO?该字符串为nil,因此满足条件self == nilYES应该返回,不是吗?

2 个答案:

答案 0 :(得分:2)

将消息发送到nil时,结果始终为“零偏”。这意味着它是void,nil,零或false,或“在此情况下求零”的含义。您不能编写更改此内容的代码。这是objc_msgSend运作方式的基本组成部分(并与ObjC中的消息分发运作方式密切相关)。

要理解的关键点是ObjC使用动态调度。它不依赖于编译时类型来决定调用什么。它向实际对象发送一条消息,然后对象决定如何处理它(可以在运行时通过多种机制对其进行更改)。作为一种特殊情况,“ nil”对象(实际上并不存在;它只是“指向0x00的指针”),对于每条消息始终返回零位结果。因此,在运行时,a的类型为NSString*并不重要。它只是一个对象,它对消息进行响应,如果为零,则它将以一种类似零的方式对消息进行响应。

所以答案是“不要这样做”。检查“空字符串”的惯用方式是:

if ([string length] == 0) { ... }

这个习惯用法依赖于[nil length]将返回0的事实。

答案 1 :(得分:0)

实际上,当字符串为nil时,它只是nil,不是字符串您将消息发送到零,什么都不会发生。

因此,如果要使用类别来判断字符串是否为空字符串,则可以将其用作参数,例如:

+ (BOOL)judgeIsEmptyString:(NSString *)string {
    if ([string isEqual:[NSNull null]] || string == NULL || string == nil || [string isEqualToString:@""] || string.length == 0)
    {
        return YES;
    }
    return NO;
}