Являются ли 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".
Любая помощь будет высоко оценена.
Спасибо,
Мониш.
Ответы
Ответ 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 * ")