На самом деле мой вопрос здесь: 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.
nil
и NULL
по существу одинаковы, nil
- это что-то вроде (NSObject *) 0
, а NULL
больше похож на (void *) 0
. Но оба являются указателями с нулевым целым значением. Вы можете отправлять сообщения на nil
, не вызывая ошибки. Однако
NSNull
и NULL
(или nil
, конечно) - это разные вещи. Вы просто используете NSNull
в качестве помощника, чтобы добавить пустой
объект в NSArray
или другой контейнерный класс, поскольку вы не можете добавить nil
] им. Поэтому вместо этого вы используете [NSNull null]
в качестве замены, и вам нужно проверить, является ли элемент массива NSNull
, а не nil
(он будет никогда не быть равным nil
).
Концепция та же, с той лишь разницей, что можно отправлять сообщения (метод вызова) с нулевым значением.
NSNull - это реальный (одноэлементный) класс, который может использоваться для массивов или словарей, которые не принимают значения NULL или nil.
Нет, NSNull
и nil
не одно и то же. Они оба представляют отсутствие значения, и вы можете захотеть обращаться с ними одинаково, но они все равно не равны.
Экземпляр объекта NSNull
представляет нулевое значение, например, когда вы читаете данные из базы данных, в которой есть нулевые значения.
Значение nil
- это нулевой указатель, т.е. он не указывает ни на один экземпляр объекта.
В вашем втором коде у вас нет ни одного экземпляра NSNull
. Указатель NSString
, содержащий нулевой указатель, не является экземпляром NSNull
, это по-прежнему просто нулевой указатель. Вы сравниваете один нулевой указатель с другим, и они, конечно, равны.
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, я думаю - так что на практике это не имеет значения.