ДЕЙСТВИТЕЛЬНО ЛИ ПУСТОЙ УКАЗАТЕЛЬ и ноль эквивалентны?

На самом деле мой вопрос здесь: null и nil эквивалентный или нет?

У меня есть пример, но я смущен, когда они равны, когда они не.

NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
id aValue = [arrayWithNull objectAtIndex:0];

if (aValue == nil) {
    NSLog(@"equals nil");
} else if (aValue == [NSNull null]) {
    NSLog(@"equals NSNull instance");
    if ([aValue isEqual:nil]) {
        NSLog(@"isEqual:nil");
    }
}

Здесь в вышеупомянутом случае это показывает этому обоих null и nil не равны, и это отображается, "равняется экземпляру NSNull"

NSString *str=NULL;
id str1=nil;
if(str1 == str)
{
   printf("\n IS EQUAL........");

}
else
{
    printf("\n NOT EQUAL........");
}

И во втором случае это показывает и равно, и это отображается, "РАВНО".

Чья-либо справка будет очень цениться.

Спасибо, Monish.

17
задан fuzzy 29 December 2012 в 07:14
поделиться

4 ответа

nil и NULL по существу одинаковы, nil - это что-то вроде (NSObject *) 0 , а NULL больше похож на (void *) 0 . Но оба являются указателями с нулевым целым значением. Вы можете отправлять сообщения на nil , не вызывая ошибки. Однако

NSNull и NULL (или nil , конечно) - это разные вещи. Вы просто используете NSNull в качестве помощника, чтобы добавить пустой объект в NSArray или другой контейнерный класс, поскольку вы не можете добавить nil ] им. Поэтому вместо этого вы используете [NSNull null] в качестве замены, и вам нужно проверить, является ли элемент массива NSNull , а не nil (он будет никогда не быть равным nil ).

22
ответ дан 30 November 2019 в 12:00
поделиться

Концепция та же, с той лишь разницей, что можно отправлять сообщения (метод вызова) с нулевым значением.

NSNull - это реальный (одноэлементный) класс, который может использоваться для массивов или словарей, которые не принимают значения NULL или nil.

2
ответ дан 30 November 2019 в 12:00
поделиться

Нет, NSNull и nil не одно и то же. Они оба представляют отсутствие значения, и вы можете захотеть обращаться с ними одинаково, но они все равно не равны.

Экземпляр объекта NSNull представляет нулевое значение, например, когда вы читаете данные из базы данных, в которой есть нулевые значения.

Значение nil - это нулевой указатель, т.е. он не указывает ни на один экземпляр объекта.

В вашем втором коде у вас нет ни одного экземпляра NSNull. Указатель NSString, содержащий нулевой указатель, не является экземпляром NSNull, это по-прежнему просто нулевой указатель. Вы сравниваете один нулевой указатель с другим, и они, конечно, равны.

1
ответ дан 30 November 2019 в 12:00
поделиться

From http://www.iphonedevsdk.com/forum/iphone-sdk-development/34826-nil-vs-null.html

nil and NULL are 100% interchangeable.

От:

  • NULL - для указателей памяти в стиле C.
  • nil - для объектов Objective-C.
  • Nil - для классов Objective-C.

Когда вы пишете код Objective-C, используйте nil. NULL

Но в конечном итоге все они определяются как одно и то же - (void *)0, я думаю - так что на практике это не имеет значения.

7
ответ дан 30 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

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