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 таких вещей нет.