Когда следует использовать nil и NULL в Objective-C?

Это пример кода:

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

Когда я должен использовать nil, NULL и [NSNull null]?

Ответ 1

Вы можете использовать nil везде, где вы можете использовать null. Основное отличие состоит в том, что вы можете отправлять сообщения на nil, поэтому вы можете использовать его в некоторых местах, где null не работает.

В общем, просто используйте nil.

Ответ 2

Они различаются по своим типам. Все они равны нулю, но NULL - это void *, nil - это id, а nil - указатель класса.

Ответ 3

nil - это пустая привязка/соответствующая объекту (тип id в Objective-C). nil не получил ссылку/адрес, просто пустое значение.

NSString *str = nil;

Так что nil следует использовать, если мы имеем дело с объектом.

if(str==nil)
    NSLog("str is empty");

Теперь NULL используется для указателя не-объекта (например, указателя C) в Objective-C. Как nil, NULL не получил значения и адреса.

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

Итак, если есть ситуация, когда мне нужно проверить мою структуру (тип структурного типа) пуст или нет, я буду использовать:

if (dStruct == NULL)
    NSLog("The struct is empty");

Давайте еще один пример:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

Из наблюдения за ключевыми значениями, контекст должен быть указателем C или ссылкой на объект. Здесь для контекста мы не можем использовать nil; мы должны использовать NULL.

Наконец, класс NSNull определяет одноэлементный объект, используемый для представления нулевых значений в объектах коллекции (NSArray, NSDictionary). [NSNull null] вернет экземпляр Singleton NSNull. В основном [NSNull null] - это правильный объект.

Невозможно вставить объект nil в объект типа коллекции. Возьмем пример:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

Во второй строке мы не получим никакой ошибки, потому что совершенно справедливо вставить объект NSNull в объект типа коллекции. На третьей строке мы получим ошибку "объект не может быть nil". Поскольку nil не является объектом.

Ответ 4

NULL и nil равны друг другу, но nil - это значение объекта, а NULL - общее значение указателя ((void*)0, если быть конкретным). [NSNull null] - это объект, который должен стоять за нуль в ситуациях, когда nil не разрешен. Например, вы не можете иметь значение nil в NSArray. Поэтому, если вам нужно представить "nil", вы можете использовать [NSNull null].

Ответ 5

Я нашел следующее:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

Как он выглядит, нет никакой разницы, кроме концептуальной.

Ответ 6

Помните, что if([NSNull null]) возвращает true.

Ответ 7

Чтобы добавить комментарий от @cobbal:

MacTypes.h содержит:

#ifndef nil
   #define nil NULL
#endif

Ответ 8

Оба они всего лишь тип 0. Функционально нет никакой разницы между ними. то есть.

#define NULL ((void*)0)
#define nil ((id)0)

Есть разница, но только для себя и других людей, которые читают код, компилятору все равно.

Еще одна вещь nil - это значение объекта, а NULL - общее значение указателя.

Ответ 9

В современных SDK для OS X и iOS:

  • nil и nil и NULL идентичны в Objective-C и в Objective-C ++ перед С++ 11.
  • nil и nil и std::nullptr являются идентичен в Objective-C ++ с С++ 11.

Стилистически многие люди предпочитают использовать nil для Objective-C объектов и NULL или nullptr для других типов указателей. Я сам теперь использую nil всюду.

[NSNull null] - это singleton использование объекта для представления нулевых значений в ситуациях, когда nil запрещено как значение (как правило, в объект коллекции, такой как NSArray или NSDictionary). Вопросы программирования чисел и значений: Использование NSNull

Ответ 10

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

Для всего, что связано с Objective-C, я использую nil. Например:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

Однако при проверке достоверности моделей данных из C-структуры (например, Framework AddressBook и CoreFoundation) я использую NULL. Например:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

Таким образом, у меня есть тонкие подсказки в моем коде, если я имею дело с кодом на основе Obj-C или C.

Ответ 11

В некоторых контекстах есть разница.

Буквально Null является символом: ASCII 0.

Nil эквивалентен пробелу, без значения.

В зависимости от контекста программирования это может быть большой разницей.

Ответ 12

Используйте NULL, например, когда вы вызываете метод Objective-C с выходным параметром типа (NSError **).

Я вижу много примеров кода в Интернете, где люди предоставляют nil вместо NULL в этом случае. Это связано с тем, что это указатель на указатель и, следовательно, не непосредственно тип объекта Objective-C. Как сказано выше, nil следует использовать для типов объектов Objective-C.

Ответ 13

nil означает отсутствие значения, а NULL - No Object,

NSArray * array = @[@ "Hello World!", @101, [NSNULL null]];

Здесь [NSNULL null] - объект, который не означает объект, в то же время вы не можете добавить nil для указания отсутствия объекта.

вы можете использовать и ноль, и [NSNUll null] для проверки тоже.

Ответ 14

Это поможет вам понять разницу между nil, NIL и null.

Ниже ссылка может вам помочь:

http://nshipster.com/nil/

nil → буквальное значение null для объектов Objective-C.

Nil → буквальное значение null для классов Objective-C.

NULL → буквальное значение null для указателей C.

NSNULL → объект singleton, используемый для представления null.