Категория оценивает строку, пусто ли не работает - PullRequest
0 голосов
/ 26 сентября 2018

Я написал 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? Строка равна нулю, поэтому она соответствует условию self == nil,YES должен был вернуться, не так ли?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Когда вы отправляете сообщения на ноль, результат всегда равен нулю.Это означает, что это void, nil, zero или false, или что бы это ни значило «оценка нуля в этом контексте».Вы не можете написать код, который это меняет.Это фундаментальная часть того, как работает objc_msgSend (и тесно связана с тем, как работает диспетчеризация сообщений в ObjC).

Ключевым моментом для понимания является то, что ObjC использует динамическую диспетчеризацию.Он не полагается на типы времени компиляции, чтобы решить, что вызывать.Он отправляет сообщение фактическому объекту, и объект решает, что с ним делать (и это может быть изменено во время выполнения несколькими механизмами).В особом случае объект «nil» (который на самом деле не существует; это просто «указатель на 0x00») всегда возвращает нулевой результат для каждого сообщения.Поэтому во время выполнения не имеет значения, что a имеет тип NSString*.Это просто объект, и он отвечает на сообщения, и если он равен нулю, он будет отвечать на сообщения как ноль.

Поэтому ответ «не делайте этого».Идиоматический способ проверки «пустой строки»:

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

Эта идиома основана на том факте, что [nil length] вернет 0.

0 голосов
/ 26 сентября 2018

Когда строка равна нулю, на самом деле это всего лишь ноль, а не строка . Вы отправляете сообщение на ноль, ничего не произойдет.

Итак, если вы хотите использовать категорию для оценки строки, является ли пустая строка, вы можете принять ее в качестве параметра ,Например:

+ (BOOL)judgeIsEmptyString:(NSString *)string {
    if ([string isEqual:[NSNull null]] || string == NULL || string == nil || [string isEqualToString:@""] || string.length == 0)
    {
        return YES;
    }
    return NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...