Когда следует использовать 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.