Когда я должен использовать 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]?
16 ответов:
можно использовать
nil
о любом месте вы можете использоватьnull
. Главное отличие заключается в том, что вы можете отправлять сообщенияnil
, Так что вы можете использовать его в некоторых местах, гдеnull
Не могу работать.В общем, просто использовать
nil
.
они различаются по своим типам. Они все равны нулю, но
NULL
Этоvoid *
,nil
этоid
иNil
является указателем класса.
Нил - это пустое значение, связанное / соответствующее объекту (тип id в Objective-C). Нил нет ссылки / адреса, только пустое значение.
NSString *str = nil;
так что ноль должен использоваться, если мы имеем дело с объектом.
if(str==nil) NSLog("str is empty");
теперь NULL используется Не указатель объекта (как указатель C) в Objective-C. Как Нил, NULL не получил никакого значения ни адрес.
char *myChar = NULL; struct MyStruct *dStruct = NULL;
так что если есть ситуации, когда мне нужно проверить мой struct (переменная типа структуры) пуста или нет, я буду использовать:
if (dStruct == NULL) NSLog("The struct is empty");
давайте еще один пример,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
на
NULL и nil равны друг другу, но nil-это значение объекта, а NULL-общее значение указателя (
(void*)0
, Если быть точным).[NSNull null]
это объект, который должен стоять в течение nil в ситуациях, когда nil не допускается. Например, вы не можете иметь нулевое значение в NSArray. Так что если вам нужно представить "ноль", вы можете использовать[NSNull null]
.
Я нашел следующее:
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 */
как это выглядит, нет никакой разницы, кроме концептуальной.
чтобы расширить комментарий от @cobbal:
MacTypes.h содержит:
#ifndef nil #define nil NULL #endif
они оба просто typecast ноль В. функционально, нет никакой разницы между ними. то есть.,
#define NULL ((void*)0) #define nil ((id)0)
есть разница, но только для себя и других людей, которые читают код, компилятор не волнует.
еще одна вещь nil - это значение объекта, а NULL-это общее значение указателя.
в современных OS X и iOS SDK:
nil
иNil
иNULL
идентичны в Objective-C и in Objective-С++ до C++11.nil
иNil
иstd::nullptr
есть идентично в Objective-C++ С C++11.стилистически, многие люди предпочитают использовать
nil
для объектов Objective-C иNULL
илиnullptr
для других типов указателей. Я сам сейчас пользуюсьnil
везде.
[NSNull null]
- это синглтон объект используется для представления значений null в ситуациях, когдаnil
запрещено как значение (обычно в объекте коллекции, таком какNSArray
илиNSDictionary
). темы программирования чисел и значений: использование NSNull
для всего, что связано с Objective-C, я использую nil. Например:
- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray { if (anArray == nil) return NO; // process elements ... }
однако при проверке достоверности моделей данных из C-framework (например, addressbook framework и CoreFoundation) я использую NULL. Например:
- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord { if (aRecord == NULL) return NO; // set-up the ABUnknownPersonViewController and display it on screen .. }
таким образом, у меня есть тонкие подсказки в моем коде, если я имею дело с Obj-C или C код.
есть разница в некоторых контекстах.
буквально, Null-это символ: ASCII 0.
Nil эквивалентно пустому, без значения.
в зависимости от контекста программирования, это может быть большая разница.
используйте NULL, например, при вызове метода Objective-C с выходным параметром типа (NSError **).
Я вижу много примеров кода в интернете, где люди предоставляют nil вместо NULL в этом случае. Это связано с тем, что это указатель на указатель и, следовательно, не непосредственно тип объекта Objective-C. Как было сказано выше, nil следует использовать для типов объектов Objective-C.
nil означает отсутствие значения, в то время как NULL не представляют никакого объекта,
NSArray * array = @[@"Hello World !", @101, [NSNULL null] ];
здесь [NSNULL null] - это объект, который означает отсутствие объекта, в то же время вы не можете добавить nil, чтобы указать на отсутствие объекта.
вы можете использовать как nil, так и [NSNUll null] для проверки тоже.
Это поможет вам понять разницу между nil, NIL и null.
ссылка ниже может помочь вам в некотором роде:
nil - > литеральное нулевое значение для объектов Objective-C.
Nil - > литеральное нулевое значение для классов Objective-C.
NULL - > литеральное значение null для указателей C.
NSNULL - > одноэлементный объект, используемый для представления ноль.
Нил - это указатель объекта ничего. Хотя семантически отличается от NULL, они технически эквивалентно друг с другом.
на уровне фреймворка Foundation определяет NSNull, который определяет метод класса, +null, который возвращает одноэлементный объект NSNull. NSNull отличается от Нил или NULL, в том, что это фактический объект, а не нулевое значение.
дополнительно, в Foundation / NSObjCRuntime.ч., Нил определяется как классуказатель ни к чему.
обратитесь к этому для получения дополнительной информации-nil / Nil / NULL / NSNull