return self == nil
Этого не может быть никогда. Если вы попытаетесь отправить isNullOrEmpty
(или любое другое сообщение) на nil
, ничего не произойдет (objc_msgSend()
, функция, отвечающая за отправку сообщения, проверяет приемник nil
как одну из первых операций, которые он выполняет, и прерывает работу ).
self == (id)[NSNull null]
Этого также никогда не произойдет. Если вы отправите isNullOrEmpty
объекту, который является экземпляром NSNull
, ваш метод, который является методом NSString
, вызываться не будет. Вместо этого будет NSNull
версия (которая, вероятно, не существует).
Аналогично, ([self respondsToSelector:@selector(count)] && [(NSArray *) self count])
никогда не случится. Если объект равен и NSArray
, то isNullOrEmpty
никогда не запустится, потому что, опять же, это метод NSString
.
Соответственно, [(NSData *) self length]
не делает то, что вы думаете, что делает. NSString
экземпляры делают отвечают на length
, но приведение объекта к NSData
не использует NSData
версию метода - он все равно заканчивается как NSString
версия length
, потому что объект на самом деле и NSString
(приведение происходит только во время компиляции; оно ничего не может изменить во время выполнения).
[self isEqualToString:@"(null)"]
Здесь вы, похоже, снова проверяете на nil
, но вас вводит в заблуждение представление *1040*, которое NSLog
выбирает при печати nil
:
NSLog(@"%@", nil);
В консоли отображается (null)
, но это не означает, что сам объект является строкой с этими символами. NSLog
просто выбирает эту строку для отображения nil
. *
Несколько вещей, которые вы делаете, требуют, чтобы это было в категории на NSObject
, чтобы метод на самом деле вызывался бы , даже если объект не был NSString
.
Чтобы проверить строку, состоящую только из пробелов, все, что вам нужно, это сравнение с пустой строкой @""
после усечения пробела:
NSString * trimmedSelf = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// Then either:
[trimmedSelf isEqualToString:@""];
// Or:
([trimmedSelf length] == 0);
* И даже лучше: NSLog(@"%@", [NSNull null]);
отображает <null>
(угловые скобки вместо скобок), удивительно запутывая первые несколько раз, когда вы сталкиваетесь NSNull
.