Подтвердить что ты не робот

Как определить, является ли NSString нулевым?

У меня есть фрагмент кода, который определяет, есть ли NSString NULL, nil и т.д. Однако он сбой. Вот мой код:

NSArray *resultstwo = [database executeQuery:@"SELECT * FROM processes WHERE ready='yes' LIMIT 0,1"];
for (NSDictionary *rowtwo in resultstwo) {

NSString *getCaption = [rowtwo valueForKey:@"caption"];

if (getCaption == NULL) {
theCaption = @"Photo uploaded...";
} else if (getCaption == nil) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@""]) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@" "]) {
theCaption = @"Photo uploaded...";
}

}

И вот ошибка:

Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '-[NSNull isEqualToString:]: непризнанный селектор, отправленный экземпляру 0x3eba63d4'

Я что-то делаю неправильно? Мне нужно сделать это по-другому?

4b9b3361

Ответ 1

Значение NULL для Objective-C объектов (тип id) равно nil.

Пока NULL используется для указателей C (тип void *).

(В конце оба конца имеют одно и то же значение (0x0). Однако они различаются по типу.)

В Objective-C:

  • nil (все нижние регистры) является нулевым указатель на объект Objective-C.
  • nil (capized) - нулевой указатель для класса Objective-C.
  • NULL (все кепки) - это нулевой указатель на что-нибудь еще ( указатели C, то есть).
  • [NSNull null] является singleton для ситуаций, когда использование nil невозможно (добавление/получение nil в/из NSArray например.)

В Objective-C ++:

  • Все вышеперечисленные, плюс:
  • NULL (нижний регистр) или nullptr ( С++ 11 или более поздняя версия) является нулевым указателем на объекты С++.

Итак, для проверки с nil вы должны либо сравнить с nil (или NULL соответственно) явно:

if (getCaption == nil) ...

или ObjC/ C сделайте неявно для вас:

if (!getCaption) ...

Это работает как каждое выражение в C (и с Objective-C, являющимся его супермножеством) имеет неявное логическое значение:

expression != 0x0 => true
expression == 0x0 => false

Теперь при проверке NSNull это, очевидно, не будет работать, поскольку [NSNull null] возвращает указатель на один экземпляр NSNull, а не nil, и поэтому он не равен 0x0.

Итак, для проверки с NSNull можно использовать:

if ((NSNull *)getCaption == [NSNull null]) ...

или (предпочтительнее, см. комментарии):

if ([getCaption isKindOfClass:[NSNull class]]) ...

Имейте в виду, что последний (используя вызов сообщения) вернет false, если getCaption окажется nil, который, хотя формально правильный, может быть не тем, что вы ожидаете/хотите.

Следовательно, если одна (по какой-либо причине) должна проверять как nil/NULL , так и NSNull, нужно было бы объединить эти две проверки

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...

За помощью по формированию эквивалентных положительных проверок см. законы Де Моргана и boolean negation.

Изменить: NSHipster.com только что опубликовал замечательную статью о тонких различиях между nil, null и т.д.

Ответ 2

Вы должны использовать

if ([myNSString isEqual:[NSNull null]])

Это проверяет, равен ли объект myNSString объекту NSNull.

Ответ 3

Предпочтительным способом проверки NSNULL является

if(!getCaption || [getCaption isKindOfClass:[NSNull class]])   

Ответ 4

if([getCaption class] == [NSNull class])
    ...

Вы также можете сделать

if([getCaption isKindOfClass:[NSNull class]])
    ...

если вы хотите быть будущим доказательством против новых подклассов NSNull.

Ответ 5

Просто проверьте этот код:

NSString *object;

if(object == nil)

Это должно работать.