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



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



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



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



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


но я не в состоянии понять термины "Objective-C object" и "class" четко.



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

848   6  

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.h file

#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 объект в нужных обстоятельствах для целей документации, даже хотя ничто не мешает кому-то смешивать и сопоставлять как они идут вместе.

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

http://nshipster.com/nil/

вот некоторые важные части из ссылки:

enter image description here

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

    Ничего не найдено.