Was sind die Unterschiede zwischen NIL, NULL und [NSNULL NIL]?
-
25-10-2019 - |
Frage
Ich habe einen solchen Fehler bekommen - *Beendigung der App aufgrund der ungekordenen Ausnahme 'nsinvalidargumentException', Grund: **-[NSCFDictionary InitWithObjects: Forkeys: Graf:]: Versuch, den Null-Wert bei Objekten einzufügen [0] (Schlüssel: durchsucht) ''
Dann habe ich den folgenden Code ausprobiert
if (Obj == (id)[NSNull null]) //Obj is an id
{
NSLog(@" Obj is (id)[NSNull null]");
}
else if (Obj == nil)
{
NSLog(@"Obj is nil");
}
else if (Obj == NULL)
{
NSLog(@"Obj is NULL");
}
else
{
NSLog(@"Obj is something else");
}
searchedDict = [NSDictionary dictionaryWithObject:Obj forKey:@"searched"];
Und ich habe die NSLog -Nachricht als "obj is nil" bekommen.
Aber als ich den gleichen obigen Code verwendete, als OBJ NSString war und meine App aufgrund des Null -Werts beendet wurde, erhielt ich die NSLog -Nachricht als "obj ist (id) [nsnull null].
Was sind die Unterschiede zwischen NIL, NULL und [NSNULL NIL]?
Gibt es verschiedene Arten von Nullwerten? Wenn ja, wie Sie häufig auf diese Nullwerte überprüfen?
Vielen Dank :-)
Lösung
NULL
ist der ursprüngliche Wert im C-Stil, der einem Zeiger gegeben wird, der auf keine explizite Adresse hinweist. Es wird im Allgemeinen nur "uneingestaltet" oder als Sentinel -Wert.
char * oldstring = NULL;
nil
ist die objektive c-Version desselben wie auf OBJ-C-Objektreferenzen angewendet:
NSString * str = nil;
id foo = nil;
Sie sind beide als gleich dem Wert Null und obwohl Sie könnte Verwenden Sie sie austauschbar, ersterer ist hauptsächlich innerhalb von OBJ-C für traditionelle Zeiger zu sehen (wie das Einstellen void *
Kontextzeiger auf null) und nil
wird für alle OBJ-C-Objektreferenzen verwendet.
Der Unterschied besteht darin sind konzeptionell nicht gleich als "Zeiger". Daher die Schaffung eines besonderen Sentinel für sie.
[NSNull null]
ist ein Objekt das ist beabsichtigt in sehr bestimmten Fällen verwendet werden (wie das Einsetzen in Sammlungen), in denen ein "Nicht-Wert" -Wert erwünscht ist, aber tatsächlich nil
ist nicht erlaubt und ein Objekt muss verwendet werden.
Beachten Sie, dass nil
und NSNull
Stringify sehr ähnlich: nil
Stringifies as (null)
, und NSNull
wie <null>
.
Andere Tipps
[NSNull null]
ist ein Wrapper für die nil
Wert, den Sie in die Sammlung einfügen möchten, wenn es das ist, was Sie wollen.
Nsnull Klassenreferenz.
Sie können auch überprüfen, ob eine Objektreferenz ist nil
Einfach mit ==
.
Ebenfalls nil
ist definiert als : #define nil NULL
und ist objektiv C gleichwertig für c NULL
.
Nil ist für Objektzeiger
Null ist für Nichtzeiger
Nsnull null] ist ein Objekt, das "nil" darstellt, in dem in Fällen nicht zulässig sind (wie in den Sammlungen, z. B. nsarray und nsdictionary)