Kiedy należy używać nil i NULL w Objective-C?

Oto przykładowy kod:

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]");

Kiedy należy używać nil, NULL i [NSNull null]?

Author: Biranchi, 2009-10-14

16 answers

Możesz użyć nil wszędzie, gdzie możesz użyć null. Główną różnicą jest to, że można wysyłać wiadomości do nil, więc można go używać w niektórych miejscach, gdzie null nie działa.

Ogólnie rzecz biorąc, wystarczy użyć nil.

 95
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 14:15:59

Różnią się one rodzajem. Wszystkie są zerowe, ale NULL jest void *, nil jest id, a Nil jest wskaźnikiem klasy.

 286
Author: NSResponder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-03 07:41:10

Nil jest pustą wartością związaną / odpowiadającą obiektowi (Typ id w Objective-C). nil nie ma referencji/adresu, tylko pustą wartość.

NSString *str = nil;

Więc nil powinien być użyty, jeśli mamy do czynienia z obiektem.

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

Teraz NULL jest używany dla wskaźnik nie-obiektowy (jak wskaźnik C) w Objective-C. Podobnie jak nil , NULL nie ma wartości ani adresu.

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

Więc jeśli jest sytuacja, kiedy muszę sprawdzić moje struct (zmienna typu struktura) jest pusta lub nie wtedy użyję:

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

Weźmy inny przykład,

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

Of key-value observing , kontekst powinien być wskaźnikiem C lub odniesieniem do obiektu. Tutaj dla kontekstu nie możemy użyć nil; musimy użyć NULL.

Wreszcie klasa nsnull definiuje obiekt singleton używany do reprezentowania wartości null w obiektach kolekcji(NSArray, NSDictionary). [NSNull null] will zwraca instancję singleton nsnull. Zasadniczo [NSNull null] jest właściwym obiektem.

Nie ma możliwości wstawienia obiektu nil do obiektu typu collection. Weźmy przykład:

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

W drugiej linii nie otrzymamy żadnego błędu, ponieważ jest całkowicie sprawiedliwe wstawianie obiektu NSNull do obiektu typu collection. W trzeciej linii pojawi się błąd "object cannot be nil". Ponieważ nil nie jest przedmiotem.

 24
Author: Shad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 13:38:54

NULL i nil są sobie równe, ale nil jest wartością obiektu, podczas gdy NULL jest ogólną wartością wskaźnika ((void*)0, aby być konkretnym). [NSNull null] jest obiektem, który ma stać na zero w sytuacjach, w których Zero nie jest dozwolone. Na przykład, nie możesz mieć wartości nil w NSArray. Więc jeśli chcesz reprezentować "nil", możesz użyć [NSNull null].

 18
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-17 15:06:15

Znalazłem:

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 */
Wygląda na to, że nie ma żadnej różnicy, poza koncepcyjną.
 10
Author: Colnaghi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-09 01:35:19

Uważaj, że if([NSNull null]) zwraca true.

 6
Author: Nicolas Manzini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 14:14:24

Aby rozwinąć komentarz od @ cobbal:

MacTypes.h zawiera:

#ifndef nil
   #define nil NULL
#endif
 5
Author: Justin Tanner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 03:02:10

Oba są po prostu typu zero. funkcjonalnie, nie ma różnicy między nimi. ie.,

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

Jest różnica, ale tylko dla Ciebie i innych ludzi, którzy czytają kod, kompilator ma to gdzieś.

Jeszcze jedno nil jest wartością obiektu, podczas gdy NULL jest ogólną wartością wskaźnika.

 5
Author: Nirav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-01 21:11:10

W nowoczesnych zestawach SDK OS X i iOS:

  • nil i Nil i NULL są identyczne w Objective-C i w Objective-C++ przed C++11.
  • nil i Nil i std::nullptr są identyczny w Objective-C++ Z C++11.

Stylistycznie Wiele osób woli używać nil dla obiektów Objective-C oraz NULL lub nullptr dla innych typów wskaźników. Ja sam używam teraz nil wszędzie.

[NSNull null] jest obiektem singleton używanym do reprezentowania wartości null w sytuacjach gdzie {[0] } jest zabronione jako wartość (zazwyczaj w obiekcie kolekcji, takim jak NSArray lub NSDictionary). tematy programowania liczb i wartości: Korzystanie z NSNull

 4
Author: Greg Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 14:13:47

Jak już wspomniano, są takie same, ale używam jednego lub drugiego w zależności od języka, w którym odpowiednie ramy zostały napisane.

Do wszystkiego, co związane z Objective-C, używam nil. Na przykład:

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

    // process elements
    ...
}

Jednakże, sprawdzając poprawność modeli danych z frameworka C (jak AddressBook framework i CoreFoundation), używam NULL. Na przykład:

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

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}
W ten sposób mam subtelne wskazówki w kodzie, jeśli mam do czynienia z kodem Obj-C lub C.
 3
Author: Tafkadasoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 12:03:27

Istnieje różnica w niektórych kontekstach.

Dosłownie, Null jest znakiem: ASCII 0.

Nil jest równoznaczne z pustym, brak wartości.

W zależności od kontekstu programowania może to być duża różnica.

 2
Author: Meatloaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 14:14:14

Użyj NULL na przykład, gdy wywołujesz metodę Objective-C z parametrem wyjściowym typu (NSError**).

Widzę wiele przykładowych kodów w sieci, gdzie ludzie podają nil zamiast NULL w tym przypadku. Dzieje się tak, ponieważ jest to wskaźnik do wskaźnika, a więc nie bezpośrednio obiekt typu Objective-C. Jak wspomniano powyżej, nil powinien być używany dla typów obiektów Objective-C.

 0
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 13:35:48

Nil oznacza brak wartości, podczas gdy NULL nie reprezentuje żadnego obiektu,

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

Tutaj [NSNULL null] jest obiektem, który oznacza brak obiektu, jednocześnie nie można dodać nil, aby wskazać brak obiektu.

Możesz używać zarówno nil jak i [NSNUll null] do sprawdzania.

 0
Author: Roshanboy4u,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-01 21:16:28

To pomoże Ci zrozumieć różnicę między nil, NIL i null.

Poniższy link może Ci w jakiś sposób pomóc:

Http://nshipster.com/nil/

Nil - > literalna wartość null dla obiektów Objective-C.

Nil - > literalna wartość null dla klas Objective-C.

Null - > literalna wartość null dla wskaźników C.

NSNULL - > singleton obiekt używany do reprezentowania null.

 0
Author: Subhakar Prabhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 08:09:22

Zasadniczo: nil: wskaźnik null na obiekcie i null: is for other type pointer

 0
Author: gerachev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 20:55:30

Nil jest wskaźnikiem obiektu do niczego. Chociaż semantycznie różnią się od NULL, są technicznie równoważne do siebie.

Na poziomie frameworku, Foundation Definiuje NSNull, która definiuje metodę klasy +null, która zwraca obiekt singleton NSNull. NSNull różni się od nil lub NULL tym, że jest to Rzeczywista obiekt , zamiast wartości zerowej.

DODATKOWO, w Fundacja / NSObjCRuntime.H, Nil jest zdefiniowana jako klasa Wskaźnik do niczego.

Zapoznaj się z tym, aby uzyskać więcej informacji - nil / Nil / NULL / NSNull

 0
Author: Shubham Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 05:52:11