Разница между 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]()