Ответ 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 и т.д.