Ich möchte den Unterschied zwischen wissen nil
, NIL
und null
. Ich habe gegoogelt und Folgendes gefunden:
nil
-> Nullzeiger auf Objective-C-Objekt
NIL
-> Nullzeiger auf Objective-C-Klasse
null
-> Nullzeiger auf primitiven Typ oder Fehlen von Daten
Aber ich kann die Begriffe "Objective-C-Objekt" und "Klasse" nicht klar verstehen.
Bitte erklären Sie mir das. Gibt es auch ein Wort wie NSNull
oder NSNil
in Objective-C? Wenn ja, dann erklären Sie bitte, wofür es ist.
objective-c
null
nsnull
Shweta
quelle
quelle
Antworten:
nil
ist der Literal-Nullwert für Objective-C-Objekte, der dem abstrakten Typid
oder einem über deklarierten Objective-C-Typ entspricht@interface
. Zum Beispiel:NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something
Nil
ist der Literal-Nullwert für Objective-C-Klassen, der dem Typ entsprichtClass
. Da der meiste Code keine Variablen zum Referenzieren von Klassen benötigt, ist seine Verwendung nicht üblich. Ein Beispiel ist:Class someClass = Nil; Class anotherClass = [NSString class];
NULL
ist der Literal-Nullwert für beliebige C-Zeiger. Zum Beispiel,int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL;
NSNull
ist eine Klasse für Objekte, die null darstellen. Tatsächlich gibt es nur ein Objekt, nämlich das von+[NSNull null]
. Es unterscheidet sich vonnil
danil
ist eine wörtliche Null - Wert, dh es ist kein Objekt. Die einzelne Instanz vonNSNull
ist andererseits ein geeignetes Objekt.NSNull
wird häufig in Foundation-Sammlungen verwendet, da sie keinenil
Werte speichern können. Im Falle von Wörterbüchern,-objectForKey:
kehrtnil
um anzuzeigen , dass eine bestimmte Taste kein Objekt im Wörterbuch , das entspricht, das heißt, hat sich der Schlüssel nicht in das Wörterbuch aufgenommen. Wenn Sie deutlich machen möchten, dass Sie einen bestimmten Schlüssel haben, dieser aber noch keinen Wert hat, können Sie ihn verwenden[NSNull null]
.Im Folgenden wird beispielsweise eine Ausnahme ausgelöst, da Wörterbücher keine
nil
Werte speichern können:NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:nil forKey:@"someKey"];
Andererseits ist der folgende Code gültig, da er
[NSNull null]
keinnil
Objekt ist:NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:[NSNull null] forKey:@"someKey"];
Es ist erwähnenswert, dass Foundation-Sammlungen Initialisierer haben, die
nil
als Markierung für das Ende einer Liste von Objekten dienen, ohne die Anzahl der Elemente in der Liste angeben zu müssen. Dies kann nur passieren, weilnil
es nicht in einer Foundation-Sammlung gespeichert werden kann. Zum Beispiel,NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
Was
NIL
oderNSNil
gibt es keine solche Dinge in Objective-C oder Apple - Stiftung.quelle
nil
ohne Segmentierungsfehler zu erhalten.Ich bin mir nicht sicher, aber ich denke,
nil
sollte nur anstelle von verwendet werdenid
, was Java- und C ++ - Programmierer alspointer
zu einem betrachten würdenobject
. VerwendungNULL
für Nicht-Objekt-Zeiger.nil
wird normalerweise für einen Objective-C-Objekttyp verwendet, währendNULL
er für Zeiger im C-Stil verwendet wirdquelle
Nil, Null und Nil werden mit unten verwendet
1> Null für Ziel c Klasse
2> Null für Objektiv c Objekt
3> Null für C-Zeiger
Beispiel:
1> Klasse A = Null;
2> NSString strName = nil;
3> char * pointerChar = NULL;
quelle
Angenommen, Sie haben eine Klasse,
MyClass
dann wird sie gemäß Konventionnil
verwendet, wenn Sie ihre Instanz auf den Wert Null initialisieren möchten (wienull
in Java)MyClass *obj = nil;
und wenn Sie einen primitiven Zeiger auf den Nullwert (wie in c) initialisieren möchten, den Sie verwenden
int *ptr = NULL;
und wenn Sie initialisieren möchten, um auf
Class
den Nullwert zu verweisen (wienull
in Java), verwenden SieEs ist nur eine Konvention, sonst haben Null oder Null die gleiche Bedeutung und vielleicht sind NULL, Null oder Null alle gleich.
Hier ist die Definition für diese in der
objc.h
Datei#ifndef Nil # if __has_feature(cxx_nullptr) # define Nil nullptr # else # define Nil __DARWIN_NULL # endif #endif #ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif
Und in
stddef.h
#define NULL ((void*)0)
Und die Definition von
__DARWIN_NULL
in_types.h
#define __DARWIN_NULL ((void *)0)
Es gibt also logischerweise keinen Unterschied. Die Hauptidee hier ist, einen Zeiger zu initialisieren, ob
C
oderObjective-C
zu0
. Wenn Sie Kenntnisse habenC
, können Sie zuweisenint *ptr = 0;
ohne Typ Casting
0
auf einen Zeiger. Da Sie keine Typumwandlung benötigen0
, um sie einem Zeiger zuzuweisen.Kurz gesagt, sie sind alle
0
und sonst nichts.quelle
NULL
ist in Kleinbuchstaben:null
Dies wird Ihnen helfen, den Unterschied zwischen nil, NIL und null zu verstehen.
Der folgende Link kann Ihnen in gewisser Weise helfen:
http://nshipster.com/nil/
Hier ist ein wichtiger Teil des Links:
quelle
Null, Null und Null. hängt von Ihrer Anforderung ab.
NSNull
Sammlungen mögen
NSArray
undNSDictionary
können keine Nullwerte enthalten.NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary]; MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey" NSLog(@"Keys: %@", [mutableDictionary allKeys]);
Null
Alle Zeiger, die das Objekt auf andere Objekte hat, beginnen mit nil, daher ist es beispielsweise nicht erforderlich, in init-Methoden self. (assoziation) = nil zu setzen.
In anderen Sprachen wie C ++ würde dies Ihr Programm zum Absturz bringen, aber in Objective-C gibt das Aufrufen einer Methode für nil einen Wert von Null zurück.
if (name != nil) { ........ }
Symbol Wert Bedeutung
nil (id) 0 Literal-Nullwert für Objective-C-Objekte
Nil (Klasse) 0 Literal-Nullwert für Objective-C-Klassen
quelle