Разница между nil, NIL и, null в Objective-C

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

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

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

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

Но я не могу четко понимать термины "Objective-C object" и "class".

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

Ответ 1

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

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

if (anotherObject == nil) // do something

nil - это буквальное значение null для классов 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 - это буквальное значение null, т.е. Оно не является объектом. С другой стороны, единственный экземпляр NSNull является правильным объектом.

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

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

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.

Ответ 2

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

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

Ответ 3

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

MyClass *obj = nil;


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

int *ptr = NULL; 

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

Class classRefOfMyClass = Nil;

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

Вот определение для них в файле 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 и ничего больше.

Ответ 4

nil, NIL и null. зависит от вашего требования.

NSNull

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

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

ноль

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

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

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

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

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

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

Ответ 5

Nil, Null и nil используются ниже

1 > Nil для Objective c Class

2 > nil для объекта Objective c

3 > Указатель Null для C

Пример:

1 > Класс A = Nil;

2 > NSString strName = nil;

3 > char * pointerChar = NULL;

Ответ 6

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

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

Ниже ссылка может вам помочь:

http://nshipster.com/nil/

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

enter image description here