Когда я должен использовать 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 152

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 */

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

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

чтобы расширить комментарий от @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.

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

http://nshipster.com/nil/

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

Nil - > литеральное нулевое значение для классов Objective-C.

NULL - > литеральное значение null для указателей C.

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

в основном: нулевой: нулевой указатель на объект и null: для другого типа указателя

Нил - это указатель объекта ничего. Хотя семантически отличается от NULL, они технически эквивалентно друг с другом.

на уровне фреймворка Foundation определяет NSNull, который определяет метод класса, +null, который возвращает одноэлементный объект NSNull. NSNull отличается от Нил или NULL, в том, что это фактический объект, а не нулевое значение.

дополнительно, в Foundation / NSObjCRuntime.ч., Нил определяется как классуказатель ни к чему.

обратитесь к этому для получения дополнительной информации-nil / Nil / NULL / NSNull