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

Objective-C: Какая разница между NULL, nil и @""?

Как гласит название, какая разница между NULL, nil и @""?

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

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

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

или

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

или

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

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

4b9b3361

Ответ 1

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

 //MacTypes.h
 #define nil NULL

So

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

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

О программе:

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

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

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

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

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

Ответ 2

nil == (id) 0
Nil == (Class) 0
NULL == (void *) 0

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

Ответ 3

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

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

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

Ответ 4

valueForKey: (и большинство других методов Cocoa) возвращает указатель (адрес памяти) объекту. Когда вы используете символ ==, вы просто проверяете числовое значение этого указателя, а не фактическое значение строки. Когда вы используете 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.

Ответ 5

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

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

или облегчить способы сказать

Все они равны нулю, но "NULL" - это void *, "nil" - это id, а "Nil" - указатель класса.

Ответ 6

Nil и NULL указывают на небытие
@"" указывает на существование и пустое