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

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

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

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

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

Но я не могу четко понимать термины "объект Objective-C" и "класс".

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

66 голосов | спросил shweta 6 Maypm11 2011, 12:45:21

6 ответов


0

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 - буквальное нулевое значение для произвольных указателей Си. Например,

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

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

ответил 6 Maypm11 2011, 13:19:55
0

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

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

ответил visakh7 6 Maypm11 2011, 12:53:27
0

Ноль, Ноль и ноль используются ниже

1 > Ноль для цели c класса

2 > ноль для объективного объекта c

3 > Нулевое значение для указателя C

Пример:

1> Класс A = ноль;

2> NSString strName = nil;

3> char * pointerChar = NULL;

ответил Chris Alan 19 FebruaryEurope/MoscowbWed, 19 Feb 2014 10:35:00 +0400000000amWed, 19 Feb 2014 10:35:00 +040014 2014, 10:35:00
0

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

MyClass *obj = nil;


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

int *ptr = NULL; 


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

Class classRefOfMyClass = Nil;

Это просто соглашение, иначе Nil или nil имеют одинаковое значение и, возможно, NULL, nil или 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 и ничего более.

ответил Inder Kumar Rathore 6 Maypm11 2011, 13:17:53
0

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

  

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

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

http://nshipster.com/nil/

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

введите описание изображения здесь

ответил Mihir Oza 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 10 Sep 2014 13:03:56 +0400 2014, 13:03:56
0

ноль, ноль и ноль. зависит от вашего требования.

NSNull

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

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

ноль

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

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

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

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

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

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

ответил Bhumesh Purohit 18 J0000006Europe/Moscow 2015, 08:56:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132