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



我写了一个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应该返回,不是吗?

当您将消息发送到 nil 时,结果始终是"零"。这意味着它是 void、nil、0 或 false,或者"在这种情况下评估零"意味着什么。您不能编写更改此设置的代码。它是objc_msgSend工作的基本部分(并且与 ObjC 中的消息调度工作方式密切相关(。

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

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

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

这个成语依赖于[nil length]将返回 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;
}

相关内容

最新更新