Значение NULL
для объектов Objective C (тип id
) равно nil
.
Пока NULL
используется для C указателей (тип void *
).
(В итоге оба получают одинаковое значение (0x0
). Однако они различаются по типу.)
В Объектив-C :
nil
(все строчные буквы) пусто
указатель на объект Objective C .
Nil
(с большой буквы) - нулевой указатель
в Objective-C класс .
NULL
(все заглавные буквы) - нулевой указатель на
что-нибудь еще ( C указатели , то есть) .
[NSNull null]
- это синглтон для ситуаций, когда использование ноля невозможно (добавление / получение ноля к / от NSArray
с, например)
In Objective-C ++ :
- Все вышеперечисленное , плюс:
null
(строчные буквы) или nullptr
( C ++ 11 или более поздние) - нулевой указатель на C ++ объектов .
Поэтому для проверки по 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]]) ...
Для получения справки о формировании эквивалентных положительных проверок см. Законы Де Моргана и логическое отрицание .
Редактировать: NSHipster.com только что опубликовал отличную статью о тонких различиях между нулями, нулями и т. Д.