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]?
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
.
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.
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.
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]
.
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ą.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
.
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
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.
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
iNil
iNULL
są identyczne w Objective-C i w Objective-C++ przed C++11. -
nil
iNil
istd::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
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.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.
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.
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.
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:
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.
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
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
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