Подтвердить что ты не робот

Являются ли NULL и ноль эквивалентными?

Собственно, мой вопрос здесь: эквиваленты 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........");
}

И во втором случае он показывает, что оба они равны, и он отображает "EQUAL".

Любая помощь будет высоко оценена.

Спасибо, Мониш.

4b9b3361

Ответ 1

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

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

Ответ 2

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

nil и NULL являются взаимозаменяемыми на 100%.

От:

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

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

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

Ответ 3

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

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

Ответ 4

Самая большая разница между ними: отправка сообщения в объект NSNULL, вероятно, приведет к сбою, тогда как охлаждать отправку любого сообщения на nil. Например, если вы используете ключевой путь для получения массива, например:

NSArray *departmentNames = [departments valueForKey:@"name"];

Тогда у вас будет объект NSNULL для любого отдела, name которого nil. Таким образом, это приведет к сбою:

for (NSString *name in departmentNames)
    NSLog(@"%@", [name lowercaseString]);

всякий раз, когда name NSNULL, потому что вы отправили неизвестный селектор (lowercaseString) в NSNULL.

Урок: проверьте объект NSNULL в массиве перед отправкой любого сообщения в его элементы.

for (NSString *name in departmentNames)
    if (name != [NSNull null])
         NSLog(@"%@", [name lowercaseString]);

Ответ 5

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

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

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

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

Ответ 6

Убедитесь, что вы указали тип [NSNull null] на тип объекта, который вы сравниваете

NSArray list;
if(list==(NSArray *)[NSNull null])
    // do something

в противном случае вы получите предупреждающее сообщение "Сравнение различных типов указателей (" тип * "и" NSNull * ")