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]?
objective-c
null
nsnull
Biranchi
źródło
źródło
nil
oznacza rodzajNULL
instancji for objc. Możesz więc oznaczyć określoną wartość, która jest przeznaczona dla instancji objc lub wskaźnika ogólnego. Ze względu na zarządzanie typami i bezpieczeństwo, będzie to bardzo pomocne.nil
inull
/NULL
są takie same - oba zdefiniowane jako zero. Jako formalność, używajnil
podczas kodowania Objective-C iNULL
podczas kodowania zwykłych instrukcji / wywołań C / C ++.NSNull
jest jednak czymś zupełnie innym. Jest to obiekt typu singleton, który służy jako symbol zastępczy reprezentujący „nic”, np. W NSDictionarys, w których wskaźniki nil / null nie są dozwolone.Odpowiedzi:
Możesz używać
nil
wszędzie, gdzie możesz użyćnull
. Główną różnicą jest to, że możesz wysyłać wiadomości donil
, więc możesz go używać w niektórych miejscach, w którychnull
nie możesz pracować.Ogólnie po prostu użyj
nil
.źródło
#define nil NULL
[NSNull null]
jest to zupełnie inna bestia. Cytując z NSNull Class Reference : „Klasa NSNull definiuje pojedynczy obiekt używany do reprezentowania wartości null w obiektach kolekcji (które nie zezwalają na wartości zerowe)”. Zobacz również sekcję Używanie NSNull w tematach programowania liczb i wartości.NULL
.Różnią się typami. Wszystkie mają wartość zero, ale
NULL
jest avoid *
,nil
jestid
iNil
jest wskaźnikiem klasy.źródło
NULL
vnil
, ale to poważnie pomija znak re[NSNull null]
. Zobacz sekcję Using NSNull w Number and Value Programming Topics i NSNull Class Reference .void *
. Inna odpowiedź tutaj już o tym wspomina, ale jeśli się zagłębiszobjc.h
, znajdziesz linię#define nill __DARWIN_NULL
.nil jest pustą wartością powiązaną / odpowiadającą obiektowi (typ id w Objective-C). nil nie ma odniesienia / adresu, tylko pustą wartość.
Więc nil powinno być używane, jeśli mamy do czynienia z przedmiotem.
Teraz NULL jest używany dla wskaźnika niebędącego przedmiotem (jak wskaźnik C) w Objective-C. Podobnie jak nil , NULL nie ma wartości ani adresu.
Jeśli więc zaistnieje sytuacja, w której muszę sprawdzić, czy moja struct (zmienna typu struktury) jest pusta, czy nie, to użyję:
Spójrzmy na inny przykład
W przypadku obserwacji klucz-wartość kontekst powinien być wskaźnikiem C lub odwołaniem do obiektu. Tutaj dla kontekstu nie możemy użyć nil ; musimy użyć NULL .
Wreszcie klasa NSNull definiuje pojedynczy obiekt używany do reprezentowania wartości null w obiektach kolekcji (NSArray, NSDictionary). [NSNull null] will powraca instancja pojedyncza z NSNull. Zasadniczo [NSNull null] jest właściwym obiektem.
Nie ma możliwości wstawienia obiektu zerowego do obiektu typu kolekcji. Spójrzmy na przykład:
W drugiej linii nie otrzymamy żadnego błędu, ponieważ wstawienie obiektu NSNull do obiektu typu kolekcji jest całkowicie uczciwe. W trzecim wierszu pojawi się błąd „obiekt nie może być zerowy”. Ponieważ zero nie jest przedmiotem.
źródło
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
konkretnie).[NSNull null]
jest obiektem, który ma zastępować zero w sytuacjach, gdy zero jest niedozwolone. Na przykład nie możesz mieć wartości zerowej w tablicy NSArray. Więc jeśli chcesz przedstawić „zero”, możesz użyć[NSNull null]
.źródło
Znalazłem następujące:
objc.h
_types.h
stddef.h
MacTypes.h
Wygląda na to, że nie ma różnicy, ale koncepcyjna.
źródło
Uważaj, że
if([NSNull null])
powracatrue
.źródło
Oba są po prostu zerami typu typecast. Funkcjonalnie nie ma między nimi różnicy. to znaczy.,
Jest różnica, ale kompilator nie przejmuje się tylko Tobą i innymi ludźmi, którzy czytają kod.
Jeszcze jedno zero to wartość obiektu, podczas gdy NULL to ogólna wartość wskaźnika.
źródło
W nowoczesnych pakietach SDK dla systemów OS X i iOS:
nil
iNil
aNULL
są takie same w celu C w celu C ++, po czym c ++ 11.nil
iNil
astd::nullptr
są takie same w celu C ++ z C ++ 11.Stylistycznie, wiele osób woli używać
nil
dla obiektów Objective-C i /NULL
lubnullptr
dla innych typów wskaźników. Ja sam teraz używamnil
wszędzie.[NSNull null]
jest pojedynczym obiektem używanym do reprezentowania wartości null w sytuacjach, w którychnil
jest zabronione jako wartość (zwykle w obiekcie kolekcji, takim jakNSArray
lubNSDictionary
). Tematy programowania liczb i wartości: Korzystanie z NSNullźródło
Aby rozwinąć komentarz z @cobbal:
MacTypes.h zawiera:
źródło
Jak już wspomniano, są takie same, ale używam jednego lub drugiego w zależności od języka, w którym napisano odpowiedni framework.
Do wszystkiego, co dotyczy Objective-C, używam nil. Na przykład:
Jednak podczas sprawdzania poprawności modeli danych z frameworka C (takiego jak Framework AddressBook i CoreFoundation) używam NULL. Na przykład:
W ten sposób mam subtelne wskazówki w moim kodzie, jeśli mam do czynienia z kodem opartym na Obj-C lub C.
źródło
nil jest wskaźnikiem obiektu do niczego. Chociaż semantycznie różnią się od NULL , są one technicznie równoważne .
Na poziomie platformy Foundation definiuje NSNull , który definiuje metodę klasy + null, która zwraca pojedynczy obiekt NSNull. NSNull różni się od nil lub NULL tym , że jest rzeczywistym obiektem , a nie wartością zerową.
Ponadto w Foundation / NSObjCRuntime.h Nil jest zdefiniowane jako wskaźnik klasy do niczego.
Więcej informacji znajdziesz w tym artykule - nil / Nil / NULL / NSNull
źródło
W niektórych kontekstach występuje różnica.
Dosłownie Null to znak: ASCII 0.
Brak jest równoznaczne z pustą wartością, brak wartości.
W zależności od kontekstu programowania może to być duża różnica.
źródło
Użyj wartości NULL, na przykład, gdy wywołujesz metodę Objective-C z parametrem wyjściowym typu (NSError **).
Widzę wiele przykładowych kodów w sieci, w których ludzie w tym przypadku podają nil zamiast NULL. Dzieje się tak, ponieważ jest to wskaźnik do wskaźnika, a zatem nie jest bezpośrednio typem obiektu Objective-C. Jak wspomniano powyżej, nil powinno być używane dla typów obiektów Objective-C.
źródło
Zasadniczo: nil: null wskaźnik na obiekcie i null: jest dla innego wskaźnika typu
źródło
zero oznacza brak wartości, podczas gdy NULL oznacza brak obiektu,
NSArray * array = @ [@ "Hello World!", @ 101, [NSNULL null]];
Tutaj [NSNULL null] jest obiektem, co oznacza brak obiektu, w tym samym czasie nie można dodać nil, aby wskazać brak obiektu.
możesz użyć zarówno nil, jak i [NSNUll null] do sprawdzania.
źródło
Pomoże ci to zrozumieć różnicę między nil, NIL i null.
Poniższy link może w jakiś sposób pomóc:
http://nshipster.com/nil/
źródło