Разница между nil, NIL и, null в Objective-C
Я хочу знать разницу между nil,NIL и null.
Я googled вокруг и нашел это:
nil -> нулевой указатель на объект Objective-C
NIL - > нулевой указатель на класс Objective-C
null -> нулевой указатель на примитивный тип или отсутствие
но я не в состоянии понять термины "Objective-C object" и "class" четко.
пожалуйста, объясните мне это. Кроме того, есть ли такое слово, как NSNull или NSNil в Objective-C? Если да, то, пожалуйста, объясните, для чего это.
6 ответов:
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- это буквальное значение null для произвольного с указателями. Для например,int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL;
NSNull- это класс для объектов, представляющих null. На самом деле, есть только один объект, а именно тот, возвращенные+[NSNull null]. Это отличается отnil, потому чтоnilявляется литеральным нулевым значением, т. е. это не объект. Единственный экземплярNSNull, С другой стороны, это правильный объект.
NSNullчасто используется в фондовых коллекциях, так как они не могут хранить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.
Я не уверен, но мне кажется
nilследует использовать только вместоid, что Java и C++ программисты будут думать какpointerдоobject. ИспользуйтеNULLдля указателей без объектов.
nilобычно используется для типа объекта Objective-C, в то время какNULLиспользуется для указателей c-стиля
Nil, Null и nil используются С ниже
1 > ноль для класса Objective c
2 > ноль для объекта Objective c
3 > Null для указателя C
пример:
1 > Класс A=Nil;
2 > NSString strName=nil;
3>char * pointerChar = NULL;
Предположим, у вас есть класс
MyClassтогда по соглашениюnilиспользуется, если вы хотите инициализировать его экземпляр нулевым значением (то же самое, что иnullв java) то естьMyClass *obj = nil;
и если вы хотите инициализировать примитивный указатель на нулевое значение (то же, что и в c), вы используетеint *ptr = NULL;
и если вы хотите инициализироватьClassссылка на нулевое значение (то же самое, что иnullв java) затем используйтеClass classRefOfMyClass = Nil;это просто конвенции, в противном случае не пропустит или не пропустит имеют тот же смысл, и, возможно, нуль , ноль или ноль все же.
вот определение для них в
objc.hfile#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и больше ничего.
Это поможет вам понять разницу между nil,NIL и null.
все три из этих значений представляют нулевые, или нулевой указатель, значения. Этот разница в том, что пока NULL представляет ноль для любого указателя,Нил is характерные для объекты (например, id) и Нил конкретной класса указатели. Следует считать лучшей практикой использования правильного null объект в нужных обстоятельствах для целей документации, даже хотя ничто не мешает кому-то смешивать и сопоставлять как они идут вместе.
ссылка ниже может помочь вам в некотором роде:
вот некоторые важные части из ссылки:
nil, NIL и null. зависит от вашего требования.
NSNull
наборы
NSArrayиNSDictionaryне в состоянии содержать нулевые значения.NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary]; MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey" NSLog(@"Keys: %@", [mutableDictionary allKeys]);Нил
все указатели, которые объект имеет на другие объекты, начинаются с нуля, поэтому нет необходимости, например, устанавливать self.(ассоциация) = nil in init методы.
на других языках, таких как C++, это приведет к сбою вашей программы, но в Objective-C, вызов метода на nil возвращает нулевое значение.
if (name != nil) { ........ }Значение Символа Значение
nil (id)0 литеральное нулевое значение для объектов Objective-C
Nil (Class)0 литеральное нулевое значение для Objective-C classes

Comments