Unterschied zwischen nil, NIL und null in Objective-C

72

Ich möchte den Unterschied zwischen wissen nil, NILund 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 NSNulloder NSNilin Objective-C? Wenn ja, dann erklären Sie bitte, wofür es ist.

Shweta
quelle
Ein Objective-C-Objekt ist eine Instanz einer Objective-C-Klasse (die über @interface deklariert wird). Die Instanz wird normalerweise mit [[MyClass alloc] init] oder [MyClass new] erstellt.
MKroehnert
In ObjC ist der Unterschied zwischen Objekt und Klasse der gleiche wie in jeder anderen Sprache. Wenn Sie das nicht wissen, sollten Sie die OOP-Grundlagen lernen.
Eimantas

Antworten:

152

nilist der Literal-Nullwert für Objective-C-Objekte, der dem abstrakten Typ idoder einem über deklarierten Objective-C-Typ entspricht @interface. Zum Beispiel:

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

Nilist der Literal-Nullwert für Objective-C-Klassen, der dem Typ entspricht Class. 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];

NULList der Literal-Nullwert für beliebige C-Zeiger. Zum Beispiel,

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNullist eine Klasse für Objekte, die null darstellen. Tatsächlich gibt es nur ein Objekt, nämlich das von +[NSNull null]. Es unterscheidet sich von nilda nilist eine wörtliche Null - Wert, dh es ist kein Objekt. Die einzelne Instanz von NSNullist andererseits ein geeignetes Objekt.

NSNullwird häufig in Foundation-Sammlungen verwendet, da sie keine nilWerte speichern können. Im Falle von Wörterbüchern, -objectForKey:kehrt nilum 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 nilWerte speichern können:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

Andererseits ist der folgende Code gültig, da er [NSNull null]kein nilObjekt ist:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

Es ist erwähnenswert, dass Foundation-Sammlungen Initialisierer haben, die nilals 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, weil niles nicht in einer Foundation-Sammlung gespeichert werden kann. Zum Beispiel,

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

Was NILoder NSNilgibt es keine solche Dinge in Objective-C oder Apple - Stiftung.


quelle
9
Sie sollten auch beachten, dass es möglich ist, Nachrichten zu senden, nilohne Segmentierungsfehler zu erhalten.
MKroehnert
1
nette Erklärung danke. aber ich möchte fragen, ob wir NULL für objektive C-Objekte verwenden können? wie ---> id mYobj = NULL ??
Vishal Singh
Dies kann sich schnell widerspiegeln? Ist in Kürze eine Korrespondenz dafür?
Carla Camargo
7

Ich bin mir nicht sicher, aber ich denke, nilsollte nur anstelle von verwendet werden id, was Java- und C ++ - Programmierer als pointerzu einem betrachten würden object. Verwendung NULLfür Nicht-Objekt-Zeiger.

nilwird normalerweise für einen Objective-C-Objekttyp verwendet, während NULLer für Zeiger im C-Stil verwendet wird

visakh7
quelle
1
Das ist richtig. Ich denke in der Praxis spielt es keine Rolle, welche Sie verwenden. Aber folgen Sie der Konvention.
Nielsbot
Die Konvention ist nützlich, aber es ist gut zu wissen, dass nil und NULL und Nil für den Compiler alle gleich sind.
David Casseres
7

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;

Chris Alan
quelle
elegantes Beispiel Kumpel
Abhilash Reddy Kallepu
5

Angenommen, Sie haben eine Klasse, MyClass dann wird sie gemäß Konvention nilverwendet, wenn Sie ihre Instanz auf den Wert Null initialisieren möchten (wie nullin 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 Classden Nullwert zu verweisen (wie nullin Java), verwenden Sie

Class classRefOfMyClass = Nil;

Es 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.hDatei

#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_NULLin_types.h

#define __DARWIN_NULL ((void *)0)

Es gibt also logischerweise keinen Unterschied. Die Hauptidee hier ist, einen Zeiger zu initialisieren, ob Coder Objective-Czu 0. Wenn Sie Kenntnisse haben C, können Sie zuweisen

int *ptr = 0;

ohne Typ Casting 0auf einen Zeiger. Da Sie keine Typumwandlung benötigen 0, um sie einem Zeiger zuzuweisen.

Kurz gesagt, sie sind alle 0und sonst nichts.

Inder Kumar Rathore
quelle
1
Java NULList in Kleinbuchstaben:null
Victor Zamanian
2

Dies wird Ihnen helfen, den Unterschied zwischen nil, NIL und null zu verstehen.

Alle drei Werte stehen für Null- oder Nullzeigerwerte. Der Unterschied besteht darin , dass , während NULL darstellt Null für jeden Zeiger, nil spezifisch ist Objekte (z, ID) und Nil ist spezifisch für Klassenzeiger. Es sollte als eine Art Best Practice angesehen werden, das richtige Null-Objekt unter den richtigen Umständen für Dokumentationszwecke zu verwenden, auch wenn nichts jemanden davon abhält, im Laufe der Zeit zu mischen und abzugleichen.

Der folgende Link kann Ihnen in gewisser Weise helfen:

http://nshipster.com/nil/

Hier ist ein wichtiger Teil des Links:

Geben Sie hier die Bildbeschreibung ein

Mihir Oza
quelle
1

Null, Null und Null. hängt von Ihrer Anforderung ab.

NSNull

Sammlungen mögen NSArrayund NSDictionarykö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

Bhumesh Purohit
quelle