Каковы различия между нулем, NULL и [NSNULL ноль]?
Я получил такую ошибку - * Завершение приложения из-за необработанного исключения "NSInvalidArgumentException", причина: **-[NSCFDictionary initWithObjects:forKeys:count:]: попытка вставить нулевое значение в объекты [0] (ключ: поисковый запрос)'
Тогда я попробовал следующий код
if (Obj == (id)[NSNull null]) //Obj is an id
{
NSLog(@" Obj is (id)[NSNull null]");
}
else if (Obj == nil)
{
NSLog(@"Obj is nil");
}
else if (Obj == NULL)
{
NSLog(@"Obj is NULL");
}
else
{
NSLog(@"Obj is something else");
}
searchedDict = [NSDictionary dictionaryWithObject:Obj forKey:@"searched"];
И я получил сообщение NSLog "Obj is nil".
Но когда я использовал тот же код выше, когда Obj был NSString, и мое приложение было закрыто из-за значения nil, я получил сообщение NSLog как "Obj is (id)[NSNull null]".
Каковы различия между нулем, NULL и [NSNULL ноль]?
Существуют ли разные виды нулевых значений? если да, как обычно проверять эти нулевые значения?
Спасибо:-)
3 ответа
NULL
исходное значение в стиле C, присвоенное указателю, который, как считается, указывает на отсутствие явного адреса. Обычно он используется для обозначения "unset" или в качестве значения дозорного.
char * oldstring = NULL;
nil
является версией Objective-C того же самого, что и применительно к ссылкам на объекты Obj-C:
NSString * str = nil;
id foo = nil;
Они оба определены как равные нулю, и хотя вы можете использовать их взаимозаменяемо, первое видно в основном в Obj-C для традиционных указателей (например, установка void *
контекстные указатели на NULL) и nil
используется для всех ссылок на объекты Obj-C.
Разница существует, потому что, хотя синтаксис Obj-C происходит поверх C, дизайн языка более высокоуровневый, и его идентификаторы объектов концептуально не совпадают с "указателями". Отсюда создание специального дозорного для них.
[NSNull null]
является объектом, который предназначен для использования в очень определенных случаях (например, вставка в коллекции), где значение "не значение" желательно, но актуально nil
не допускается, и объект должен быть использован.
Обратите внимание, что nil
а также NSNull
очень похожий на строку: nil
Стригирует как (null)
, а также NSNull
как <null>
,
[NSNull null]
это обертка для nil
значение, которое вы хотите вставить в коллекцию, если это то, что вы хотите.
NSNull ссылка на класс.
Вы также можете проверить прежде, если ссылка на объект nil
просто с ==
,
Также nil
определяется как: #define nil NULL
и является объективным C эквивалентным для C NULL
,
Ноль для указателей объекта
NULL для не указателей
[NSNULL null] - это объект, представляющий "nil", который будет использоваться в случаях, когда значения nil недопустимы (как указал Винс, как в коллекциях, например, NSArray и NSDictionary)