Разница между нулем, нулем и нулем в Objective-C - PullRequest
69 голосов
/ 06 мая 2011

Я хочу знать разницу между nil, NIL и null. Я погуглил и нашел это:

nil -> нулевой указатель на объект Objective-C

NIL -> нулевой указатель на класс Objective-C

null -> нулевой указатель на тип примитива или отсутствие данных

Но я не могу четко понимать термины «объект Objective-C» и «класс».

Пожалуйста, объясните мне это. Кроме того, есть ли в Objective-C какое-либо слово типа NSNull или NSNil? Если да, то, пожалуйста, объясните, для чего он нужен.

Ответы [ 6 ]

147 голосов
/ 06 мая 2011

nil - это буквальное нулевое значение для объектов Objective-C, соответствующее абстрактному типу id или любому типу Objective-C, объявленному через @interface.Например:

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

Nil - это буквальное нулевое значение для классов Objective C, соответствующее типу Class.Поскольку большинству кода не нужны переменные для ссылки на классы, его использование не является распространенным.Один пример:

Class someClass = Nil;
Class anotherClass = [NSString class];

NULL - буквальное нулевое значение для произвольных указателей C.Например,

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNull является классом для объектов, которые представляют нуль.Фактически, есть только один объект, а именно тот, который возвращается +[NSNull null].Он отличается от nil, поскольку nil является буквальным нулевым значением, т. Е. Не является объектом.С другой стороны, единственный экземпляр NSNull является правильным объектом.

NSNull часто используется в коллекциях Foundation, поскольку они не могут хранить значения nil.В случае словарей -objectForKey: возвращает nil, чтобы указать, что данный ключ не имеет соответствующего объекта в словаре, т. Е. Ключ не был добавлен в словарь.Если вы хотите явно указать, что у вас есть определенный ключ, но у него еще нет значения, вы можете использовать [NSNull null].

Например, следующее выдает исключение, поскольку словари не могут хранить nil values:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

С другой стороны, следующий код действителен, поскольку [NSNull null] не является nil объектом:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

Стоит отметить, что коллекции Foundationиметь инициализаторы, которые используют nil в качестве маркера для конца списка объектов без необходимости указывать количество элементов в списке.Это может произойти только потому, что nil нельзя сохранить в коллекции Foundation.Например,

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

Что касается NIL или NSNil, в Objective-C или Apple Foundation таких вещей нет.

7 голосов
/ 19 февраля 2014

Ноль, Ноль и ноль используются с ниже

1> Ноль для объективного класса c

2> ноль для объективного объекта c

3> Нуль для указателя C

Пример:

1> Класс A = ноль;

2> NSString strName = nil;

3> char * pointerChar = NULL;

7 голосов
/ 06 мая 2011

Я не уверен, но я думаю, что nil следует использовать только вместо id, что программисты на Java и C ++ воспринимают как pointer к object.Используйте NULL для не объектных указателей.

nil обычно используется для типа объекта Objective-C, в то время как NULL используется для указателей в стиле c

5 голосов
/ 06 мая 2011

Предположим, у вас есть класс MyClass тогда по соглашению nil используется, если вы хотите инициализировать его экземпляр нулевым значением (так же, как null в Java) т.е.

MyClass *obj = nil;


и если вы хотите инициализировать указатель примитива на нулевое значение (так же, как в c), вы используете

int *ptr = NULL; 


и если вы хотите инициализировать Class ссылку на нулевое значение (аналогично null в java), тогда используйте

Class classRefOfMyClass = Nil;

Это просто соглашение, иначе ноль или ноль имеют одинаковое значение и, возможно, NULL, ноль или ноль все одинаковы.

Вот определение для них в objc.h файле

#ifndef Nil
# if __has_feature(cxx_nullptr)
#   define Nil nullptr
# else
#   define Nil __DARWIN_NULL
# endif
#endif

#ifndef nil
# if __has_feature(cxx_nullptr)
#   define nil nullptr
# else
#   define nil __DARWIN_NULL
# endif
#endif

А в stddef.h

#define NULL ((void*)0)

И определение __DARWIN_NULL в _types.h

#define __DARWIN_NULL ((void *)0)

Так что логически разницы нет. Основная идея здесь состоит в том, чтобы инициализировать указатель с C или Objective-C до 0. Если у вас есть знания C, вы можете назначить

int *ptr = 0;

без приведения типа 0 к указателю. Поскольку вам не нужно вводить 0, чтобы назначить его указателю.

Короче говоря, все они 0 и ничего больше.

2 голосов
/ 10 сентября 2014

Это поможет вам понять разницу между nil, NIL и null.

Все три из этих значений представляют собой нулевой или нулевой указатель, значения.Разница в том, что хотя NULL представляет ноль для любого указателя, nil относится к объектам (например, id) и Nil относится только к указателям на классы. Лучше всего использовать в своем роде правильный нулевой объект в правильных обстоятельствах для целей документирования, даже если ничто не мешает кому-либо смешивать и сопоставлятьпо ходу дела.

Приведенная ниже ссылка может вам как-то помочь:

http://nshipster.com/nil/

Вот некоторая важная часть ссылки:

enter image description here

1 голос
/ 18 июня 2015

ноль, ноль и ноль. зависит от вашего требования.

NSNull

коллекции, такие как NSArray и NSDictionary, не могут содержать нулевые значения.

NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary];
MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey"
NSLog(@"Keys: %@", [mutableDictionary allKeys]);

ноль

все указатели, которые объект имеет на другие объекты, начинаются как nil, поэтому нет необходимости, например, устанавливать self. (Association) = nil в методах init.

В других языках, таких как C ++, это может привести к сбою вашей программы, но в Objective-C вызов метода для nil возвращает нулевое значение.

if (name != nil)
{
........
}

Значение символа Значение

nil (id) 0 буквальное нулевое значение для объектов Objective C

Nil (Class) 0 буквальное нулевое значение для классов Objective C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...