Каковы различия между нулем, 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)

Другие вопросы по тегам