【问题标题】:The category judge a string whether empty not work类别判断字符串是否为空不起作用
【发布时间】:2019-03-02 01:06:31
【问题描述】:

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

- (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应该返回,不是吗?

【问题讨论】:

标签: objective-c


【解决方案1】:

当您向 nil 发送消息时,结果总是“零”。这意味着它是 void、nil、零或 false,或者“在这种情况下评估零”意味着什么。你不能编写改变它的代码。它是 objc_msgSend 工作方式的基本组成部分(并且与 ObjC 中消息调度的工作方式密切相关)。

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

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

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

这个习语依赖于[nil length]将返回0这一事实。

【讨论】:

    【解决方案2】:

    当一个字符串为 nil 时,其实它只是一个 nil,而不是一个字符串你向 nil 发送消息,什么都不会发生。

    所以,如果你想用一个类别来判断一个字符串是否为空字符串,你可以把它作为一个参数,例如:

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

    【讨论】:

    • 你应该更新你的答案,展示你如何在你的例子中使用这种方法。
    • 是和不是。默认情况下它返回 false,请参见:stackoverflow.com/a/2696909/1801544 这就是它响应 NO 的原因。
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多