Цель-C: Какая разница между NULL, nil и @ ""? - PullRequest
25 голосов
/ 26 ноября 2010

Как видно из названия, в чем разница между NULL, nil и @""?

Например, если я хочу проверить, что строка в словаре пуста.

Какое условие я должен использовать?

if ([dictionary objectForKey:@"aString"] == nil)

или

if [[dictionary objectForKey:@"aString"] isEqualToString:@""]

или

if ([dictionary objectForKey:@"aString"] == NULL)

Какой из них прав?

Ответы [ 6 ]

31 голосов
/ 26 ноября 2010

nil является аналогом NULL для объектов target-c. На самом деле они одинаковы:

 //MacTypes.h
 #define nil NULL

Итак

if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)

оба проверяют, присутствует ли конкретный ключ в словаре, хотя 1-я строка является более правильной, поскольку она проверяет типы target-c.

О:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])

Эта строка проверяет, есть ли в словаре запись с ключом "aString", и сравнивает эту запись с пустой строкой. Результат будет одним из следующих:

  • ложь, если для вашего ключа такой записи нет
  • имеет значение true, если для вашего ключа есть запись и эта запись является пустой строкой
  • может произойти сбой, если объект для вашего ключа существует и не отвечает на -isEqualToString: сообщение

Таким образом, в зависимости от ваших потребностей вы должны использовать 1-ю строку, или если вам нужно объединить обе проверки, если запись существует, и она не является пустой строкой, тогда вам нужно 2 условия:

if ([dictionary valueForKey:@"aString"]==nil ||
               [[dictionary valueForKey:@"aString"] isEqualToString:@""])
19 голосов
/ 27 ноября 2010
nil == (id) 0
Nil == (Class) 0
NULL == (void *) 0

@ "" - пустая константа NSString.

16 голосов
/ 26 ноября 2010

nil используется для представления нулевого указателя на объект Objective-C. Ноль используется для представления нулевого указателя на класс Objective-C. NULL используется для представления нулевого указателя на что-либо еще.

Все они могут иметь числовое значение 0. Все они равны нулю, но «NULL» является пустым *«nil» - это идентификатор, а «Nil» - указатель на класс.

@ "" используется для обозначения пустой строки или произнесения строки, длина которой равна нулю.

5 голосов
/ 26 ноября 2010

valueForKey: (и большинство других методов Какао) возвращает указатель (адрес памяти) на объект. Когда вы используете символ ==, вы просто проверяете числовое значение этого указателя, а не фактическое значение строки. Когда вы используете isEqualToString:, вы проверяете значение.

Эти два:

if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)

более или менее эквивалентны, и оба теста "Был ли адрес возвращен равным нулю?", То есть, как valueForKey: указывает, что для этого ключа не было найдено объекта. Если словарь содержит любой объект для этого ключа, независимо от его значения (например, даже пустой строки), этот оператор if возвращает false.

(Вы обычно используете версию nil в Objective-C, как соглашение по стилю, как и все остальное)

Это:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])

Проверяет фактическое значение строки, чтобы увидеть, является ли она строкой нулевой длины. Если в словаре нет объекта, он вернет false, поскольку при вызове isEqualToString: (или почти любого другого метода) для указателя nil вы всегда получаете ноль или false.

1 голос
/ 26 ноября 2010

"Класс NSNull определяет одноэлементный объект, который вы используете для представления нулевых значений в ситуациях, когда nil запрещен как значение (обычно в объекте коллекции, таком как массив или словарь)."Вы можете использовать ноль везде, где можете использовать ноль.Основным отличием является то, что вы можете отправлять сообщения на ноль, так что вы можете использовать его в некоторых местах, где ноль не может работать.В общем, просто используйте ноль.это именно то, что происходит, программист выбирает помещать нулевой объект в массив контроллеров, где nil не допускается в качестве значения.

Это скорее контекстная ссылка, где NULL - указатель на 0x0, nil - этонесуществующий объект target-c, а Nil - это несуществующий класс target-c, но технически все они равны 0. Кроме того, он имеет значение NULL, а не NULL - NULL в Java или C #, но не в Objective-C

или упрощенные способы, которыми вы говорите

Они все равны нулю, но "NULL" - это пустота *, "nil" - это идентификатор, а "Nil" - указатель класса.

0 голосов
/ 31 августа 2016

ноль и NULL указывают на несуществование
@ "" указывает на существование, и оно пустое

...