Это пример кода:
NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)
if (myNumber == nil)
NSLog(@"test 1 myNumber == nil");
if (myNumber == NULL)
NSLog(@"test 2 myNumber == NULL");
if ([myNumber isEqual:[NSNull null]])
NSLog(@"test 3 myNumber == [NSNull null]");
Когда мне следует использовать nil, NULL и [NSNull null]?
objective-c
null
nsnull
Биранчи
источник
источник
nil
означает видNULL
для объекта. Таким образом, вы можете отметить конкретное значение, предназначенное для экземпляра объекта или общего указателя. С точки зрения управления типами и безопасности, это вам очень поможет.nil
иnull
/NULL
одинаковы - оба определены как ноль. В качестве формальности используйтеnil
при кодировании Objective-C иNULL
при кодировании обычных операторов / вызовов C / C ++.NSNull
однако это нечто совершенно другое. Это одноэлементный объект, который служит заполнителем для представления «ничего», например, в NSDictionarys, где указатели nil / null недопустимы.Ответы:
Вы можете использовать
nil
где угодноnull
. Основным отличием является то, что вы можете отправлять сообщенияnil
, так что вы можете использовать его в некоторых местах, где не могутnull
работать.В общем, просто используйте
nil
.источник
#define nil NULL
[NSNull null]
это совсем другой зверь. Процитируем из ссылки на класс NSNull: «Класс NSNull определяет одноэлементный объект, используемый для представления нулевых значений в объектах коллекции (которые не допускают нулевые значения)». Также см. Раздел « Использование NSNull» в разделе « Программирование чисел и значений».NULL
.Они различаются по своим типам. Все они равны нулю, но
NULL
являютсяvoid *
,nil
являютсяid
иNil
являются указателями класса.источник
NULL
vnil
, но это серьезно не попадает в цель[NSNull null]
. См. Раздел « Использование NSNull» разделов « Программирование чисел и значений» и « Справочник по классам NSNull» .void *
. Другой ответ здесь уже упоминает об этом, но если вы покопаетесьobjc.h
, вы найдете строку#define nill __DARWIN_NULL
.nil - это пустое значение, связанное / соответствующее объекту (тип id в Objective-C). У nil нет ссылки / адреса, просто пустое значение.
Поэтому следует использовать ноль, если мы имеем дело с объектом.
Теперь NULL используется для необъектного указателя (например, указателя C) в Objective-C. Как и ноль , NULL не имеет ни значения, ни адреса.
Поэтому, если есть ситуация, когда мне нужно проверить, что моя структура (переменная типа структуры) пуста или нет, я буду использовать:
Давайте еще один пример,
Для наблюдения значения ключа контекст должен быть указателем C или ссылкой на объект. Здесь для контекста мы не можем использовать ноль ; мы должны использовать NULL .
Наконец, класс NSNull определяет одноэлементный объект, используемый для представления нулевых значений в объектах коллекции (NSArray, NSDictionary). [NSNull нуль] Воля возвращает синглтон Экземпляр NSNull. В основном [NSNull null] является правильным объектом.
Нет способа вставить объект nil в объект типа коллекции. Давайте приведем пример:
Во второй строке мы не получим никакой ошибки, потому что совершенно справедливо вставить объект NSNull в объект типа коллекции. В третьей строке мы получим ошибку «объект не может быть нулем». Потому что ноль не является объектом.
источник
NULL и nil равны друг другу, но nil - это значение объекта, в то время как NULL - это общее значение указателя (
(void*)0
если быть точным).[NSNull null]
это объект, который должен заменять ноль в ситуациях, когда ноль не разрешен. Например, вы не можете иметь значение nil в NSArray. Так что если вам нужно представить «ноль», вы можете использовать[NSNull null]
.источник
Я нашел следующее:
objc.h
_types.h
stddef.h
MacTypes.h
Как это выглядит, нет никакой разницы, кроме концептуальной.
источник
Остерегайтесь того, что
if([NSNull null])
возвращаетсяtrue
.источник
Они оба - только ноль. Функционально между ними нет разницы. то есть.,
Есть разница, но только для вас и других людей, которые читают код, компилятору все равно.
Еще одна вещь, nil - это значение объекта, а NULL - это общее значение указателя.
источник
В современных OS X и iOS SDK:
nil
иNil
иNULL
идентичны в Objective-C и в Objective-C ++ до C ++ 11.nil
иNil
иstd::nullptr
идентичны в Objective-C ++ с C ++ 11.Стилистически, многие люди предпочитают использовать
nil
для объектов Objective-C иNULL
илиnullptr
для других типов указателей. Я сам сейчас пользуюсьnil
везде.[NSNull null]
является одноэлементным объектом, используемым для представления нулевых значений в ситуациях, когдаnil
это запрещено как значение (обычно в объекте коллекции, например,NSArray
илиNSDictionary
) Темы программирования чисел и значений: использование NSNullисточник
Чтобы расширить комментарий от @cobbal:
MacTypes.h содержит:
источник
Как уже упоминалось, они одинаковы, но я использую один или другой в зависимости от языка, на котором была написана соответствующая структура.
Для всего, что связано с Objective-C, я использую ноль. Например:
Однако при проверке достоверности моделей данных из C-фреймворка (например, фреймворка AddressBook и CoreFoundation) я использую NULL. Например:
Таким образом, у меня есть тонкие подсказки в моем коде, если я имею дело с кодом на основе Obj-C или C.
источник
nil - это указатель на объект. Хотя они семантически отличаются от NULL , они технически эквивалентны друг другу.
На уровне структуры Foundation определяет NSNull , который определяет метод класса + null, который возвращает одноэлементный объект NSNull. NSNull отличается от nil или NULL тем , что это фактический объект , а не нулевое значение.
Кроме того, в Foundation / NSObjCRuntime.h Nil определяется как указатель класса на ничто.
См. Это для получения дополнительной информации - ноль / ноль / NULL / NSNull
источник
В некоторых контекстах есть разница.
Буквально, Null - это персонаж: ASCII 0.
Ноль эквивалентно пустому, нет значения.
В зависимости от контекста программирования, это может быть большой разницей.
источник
Например, используйте NULL при вызове метода Objective-C с выходным параметром типа (NSError **).
Я вижу много примеров кода в Интернете, где люди предоставляют nil вместо NULL в этом случае. Это потому, что это указатель на указатель и, следовательно, не напрямую объектный тип Objective-C. Как сказано выше, nil следует использовать для типов объектов Objective-C.
источник
В основном: nil: нулевой указатель на объект и null: для другого указателя типа
источник
nil означает отсутствие значения, в то время как NULL представляет No Object,
NSArray * array = @ [@ "Hello World!", @ 101, [NSNULL null]];
Здесь [NSNULL null] является объектом, который означает отсутствие объекта, в то же время вы не можете добавить nil, чтобы указать на отсутствие объекта.
Вы также можете использовать как nil, так и [NSNUll null] для проверки.
источник
Это поможет вам понять разницу между нулем, нулем и нулем.
Ссылка ниже может помочь вам в некотором роде:
http://nshipster.com/nil/
источник