Dies ist ein Beispielcode:
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]");
Wann sollte ich nil, NULL und [NSNull null] verwenden?
objective-c
null
nsnull
Biranchi
quelle
quelle
nil
bedeutet eine ArtNULL
für objc Instanz. Sie können also einen bestimmten Wert markieren, der für eine Objektinstanz oder einen generischen Zeiger vorgesehen ist. Im Hinblick auf Typmanagement und Sicherheit wird Ihnen dies sehr helfen.nil
undnull
/NULL
sind gleich - beide als Null definiert. Als Formalitätnil
beim Codieren von Objective-C undNULL
beim Codieren regulärer C / C ++ - Anweisungen / Aufrufe verwenden.NSNull
ist jedoch etwas ganz anderes. Es ist ein Singleton-Objekt, das als Platzhalter dient, um "nichts" in z. B. NSDictionarys darzustellen, in denen Null- / Null-Zeiger nicht zulässig sind.Antworten:
Sie können
nil
ungefähr überall verwenden, wo Sie verwenden könnennull
. Der Hauptunterschied besteht darin, dass Sie Nachrichten an senden könnennil
, sodass Sie sie an einigen Stellen verwenden können, an denen sienull
nicht funktionieren können.Im Allgemeinen nur verwenden
nil
.quelle
#define nil NULL
[NSNull null]
es sich um ein ganz anderes Tier handelt. Um aus der NSNull-Klassenreferenz zu zitieren : "Die NSNull-Klasse definiert ein Singleton-Objekt, das zur Darstellung von Nullwerten in Sammlungsobjekten verwendet wird (die keine Nullwerte zulassen)." Siehe auch NSNull Verwendung Abschnitt Anzahl und Wert der Programmierung.NULL
.Sie unterscheiden sich in ihren Typen. Sie sind alle Null, aber sie
NULL
sind einvoid *
,nil
einid
undNil
ein Klassenzeiger.quelle
NULL
vnil
, aber dies verfehlt ernsthaft die Marke re[NSNull null]
. Siehe Verwenden von NSNull Abschnitt Anzahl und Wert der Programmierung und NSNull Klassenreferenz .void *
. Eine andere Antwort hier erwähnt dies bereits, aber wenn Sie sich damit beschäftigenobjc.h
, finden Sie die Zeile#define nill __DARWIN_NULL
.nil ist ein leerer Wert, der an ein Objekt gebunden ist / diesem entspricht (der ID-Typ in Objective-C). nil hat keine Referenz / Adresse, nur einen leeren Wert.
Es sollte also Null verwendet werden, wenn es sich um ein Objekt handelt.
Jetzt wird NULL für Nicht-Objekt-Zeiger (wie ein C-Zeiger) in Objective-C verwendet. Wie Null hat NULL weder einen Wert noch eine Adresse.
Wenn es also eine Situation gibt, in der ich überprüfen muss, ob meine Struktur (Strukturtypvariable) leer ist oder nicht, verwende ich:
Lassen Sie uns ein anderes Beispiel haben, das
Bei der Beobachtung von Schlüsselwerten sollte der Kontext ein C-Zeiger oder eine Objektreferenz sein. Hier können wir für den Kontext nicht Null verwenden ; wir müssen NULL verwenden .
Schließlich definiert die NSNull- Klasse ein Singleton-Objekt, das zur Darstellung von Nullwerten in Auflistungsobjekten (NSArray, NSDictionary) verwendet wird. Die [NSNull null] gibt die Singleton-Instanz von NSNull zurück. Grundsätzlich ist [NSNull null] ein richtiges Objekt.
Es gibt keine Möglichkeit, ein Nullobjekt in ein Objekt vom Typ Sammlung einzufügen. Lassen Sie uns ein Beispiel haben:
In der zweiten Zeile wird kein Fehler angezeigt, da es durchaus fair ist, ein NSNull-Objekt in ein Objekt vom Typ Sammlung einzufügen. In der dritten Zeile erhalten wir den Fehler "Objekt kann nicht Null sein". Weil Null kein Objekt ist.
quelle
NULL und nil sind gleich, aber nil ist ein Objektwert, während NULL ein generischer Zeigerwert ist (
(void*)0
um genau zu sein).[NSNull null]
ist ein Objekt, das in Situationen, in denen Null nicht erlaubt ist, für Null stehen soll. Beispielsweise können Sie in einem NSArray keinen Nullwert haben. Wenn Sie also ein "Null" darstellen müssen, können Sie verwenden[NSNull null]
.quelle
Ich habe folgendes gefunden:
objc.h
_types.h
stddef.h
MacTypes.h
So wie es aussieht, gibt es keinen Unterschied außer einem konzeptionellen.
quelle
Passen Sie auf, dass
if([NSNull null])
zurückkehrttrue
.quelle
Sie sind beide nur typisierte Nullen. Funktionell gibt es keinen Unterschied zwischen ihnen. dh.,
Es gibt einen Unterschied, aber nur für Sie und andere Menschen, die den Code lesen, ist es dem Compiler egal.
Eine weitere Sache ist, dass nil ein Objektwert ist, während NULL ein generischer Zeigerwert ist.
quelle
In modernen OS X- und iOS-SDKs:
nil
undNil
undNULL
sind in Objective-C und in Objective-C ++ vor C ++ 11 identisch.nil
undNil
undstd::nullptr
sind in Objective-C ++ mit C ++ 11 identisch.Stilistisch bevorzugen viele Menschen die Verwendung
nil
für Objective-C-Objekte und /NULL
odernullptr
für andere Zeigertypen. Ich selbst benutze jetztnil
überall.[NSNull null]
ist ein Singleton- Objekt, das zur Darstellung von Nullwerten in Situationen verwendet wird, in denennil
dies als Wert verboten ist (normalerweise in einem Sammlungsobjekt wie einemNSArray
oderNSDictionary
). Themen zur Zahlen- und Wertprogrammierung: Verwenden von NSNullquelle
So erweitern Sie einen Kommentar von @cobbal:
MacTypes.h enthält:
quelle
Wie bereits erwähnt, sind sie gleich, aber ich verwende entweder das eine oder das andere, abhängig von der Sprache, in der das entsprechende Framework geschrieben wurde.
Für alles, was mit Objective-C zu tun hat, verwende ich nil. Beispielsweise:
Wenn ich jedoch die Gültigkeit von Datenmodellen aus einem C-Framework (wie AddressBook Framework und CoreFoundation) überprüfe, verwende ich NULL. Beispielsweise:
Auf diese Weise habe ich subtile Hinweise in meinem Code, wenn es sich um Obj-C- oder C-basierten Code handelt.
quelle
nil ist ein Objektzeiger auf nichts. Obwohl sie sich semantisch von NULL unterscheiden , sind sie technisch äquivalent zueinander.
Auf Framework-Ebene definiert Foundation NSNull , das eine Klassenmethode definiert, + null, die das Singleton-NSNull-Objekt zurückgibt. NSNull unterscheidet sich von nil oder NULL darin , dass es sich eher um ein tatsächliches Objekt als um einen Nullwert handelt.
Zusätzlich wird in Stiftung / NSObjCRuntime.h, Nil ist definiert als eine Klasse Zeiger auf nichts.
Weitere Informationen finden Sie hier - nil / Nil / NULL / NSNull
quelle
In einigen Kontexten gibt es einen Unterschied.
Null ist buchstäblich ein Zeichen: ASCII 0.
Null ist gleich leer, kein Wert.
Je nach Programmierkontext kann dies ein großer Unterschied sein.
quelle
Verwenden Sie NULL beispielsweise, wenn Sie eine Objective-C-Methode mit einem Ausgabeparameter vom Typ (NSError **) aufrufen.
Ich sehe viele Beispielcodes im Web, in denen in diesem Fall Null anstelle von NULL angegeben wird. Dies liegt daran, dass es sich um einen Zeiger auf einen Zeiger handelt und somit nicht direkt um einen Objective-C-Objekttyp. Wie oben erwähnt, sollte für Objective-C-Objekttypen nil verwendet werden.
quelle
Grundsätzlich gilt: nil: Nullzeiger auf ein Objekt und null: steht für einen anderen Zeigertyp
quelle
nil bedeutet das Fehlen eines Wertes, während NULL No Object darstellt.
NSArray * array = @ [@ "Hallo Welt!", @ 101, [NSNULL null]];
Hier ist [NSNULL null] ein Objekt, das kein Objekt bedeutet. Gleichzeitig können Sie kein Null hinzufügen, um das Fehlen eines Objekts anzuzeigen.
Sie können sowohl nil als auch [NSNUll null] zur Überprüfung verwenden.
quelle
Dies wird Ihnen helfen, den Unterschied zwischen null, null und null zu verstehen.
Der folgende Link kann Ihnen in gewisser Weise helfen:
http://nshipster.com/nil/
quelle