我写了一个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 == nil
,YES
应该返回,不是吗?
答案 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;
}