NULL и ноль эквивалентны? - PullRequest
17 голосов
/ 17 марта 2010

На самом деле мой вопрос здесь: 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........");
}

И во втором случае он показывает, что оба равны, и отображает «ЕВРО».

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

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

Ответы [ 6 ]

22 голосов
/ 17 марта 2010

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

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

7 голосов
/ 03 июля 2010

С 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, я думаю - так что на практике это не имеет значения.

2 голосов
/ 31 января 2012

Самое большое различие между ними: отправка сообщения объекту 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]);
2 голосов
/ 17 марта 2010

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

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

1 голос
/ 09 октября 2012

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

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

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

1 голос
/ 17 марта 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...