2009-10-14 5 views
149

Dies ist Codebeispiel:Wann sollte ich Nil und NULL in Objective-C verwenden?

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 null verwenden, NULL und [NSNull null]?

+4

Seine zu Objective-C Frage bezogen. – Biranchi

+0

'nil' bedeutet eine Art' NULL' für objc-Instanz. Sie können also festlegen, dass ein bestimmter Wert für eine Objc-Instanz oder einen generischen Zeiger bestimmt ist. Im Hinblick auf Typ-Management und Sicherheit wird Ihnen das sehr helfen. – Eonil

+4

'nil' und' null'/'NULL' sind gleich - beide sind als null definiert. Als Formalität verwenden Sie 'nil' beim Codieren von Objective-C und' NULL' beim Codieren von regulären C/C++ - Anweisungen/-Aufrufen. 'NSNull' ist jedoch etwas völlig anderes. Es ist ein Singleton-Objekt, das als Platzhalter dient, um "nichts" zu repräsentieren, zB in NSDictionarys, wo keine NULL/NULL-Zeiger erlaubt sind. –

Antwort

86

Sie können nil überall verwenden, wo Sie null verwenden können. Der Hauptunterschied besteht darin, dass Sie Nachrichten an nil senden können, so dass Sie es an einigen Stellen verwenden können, wo null nicht funktionieren kann.

Im Allgemeinen verwenden Sie einfach nil.

+11

technisch sind sie genau Gleich, Sie können Nachrichten sowohl an nil als auch an NULL senden. Idiomatisch obwohl Null wird normalerweise verwendet, um ein Objekt zu repräsentieren – cobbal

+39

auch, in MacTypes.h gibt es '#define nil NULL' – cobbal

+7

Ja, wie Cobbal sagt, sie sind die gleichen. Es ist eher eine kontextuelle Referenz, wobei NULL ein Zeiger auf 0x0 ist, nil ein nicht existierendes objective-c Objekt ist und Nil eine nicht existierende objective-c Klasse ist, aber technisch sind sie alle nur 0. Außerdem ist es NULL nicht null - null ist in Java oder C#, aber nicht in Objective-C. –

278

Sie unterscheiden sich in ihren Typen. Sie sind alle Null, aber NULL ist ein void *, nil ist ein id, und Nil ist ein Klassenzeiger.

+13

Beste Erklärung Ich habe von dem Unterschied gehört (: Danke. – Jacob

+3

Dies sollte die akzeptierte Antwort sein, nicht weil es mehr Ups gibt, sondern weil es die beste Erklärung für die gestellte Frage ist. – KronoS

+5

Elegante Beschreibung von 'NULL' v' nil', aber dies vermisst ernsthaft die Markierung re '[NSNull null]'. Siehe Abschnitt [Using NSNull] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html) in _Number und Value Programming Topics_ und [NSNull Class Reference] (https : //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/Reference/Reference.html). – Rob

18

NULL und Nil sind einander 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. Zum Beispiel können Sie in einem NSArray keinen Nullwert haben. Wenn Sie also eine "Null" darstellen müssen, können Sie [NSNull null] verwenden.

MacTypes.h enthält:

#ifndef nil 
    #define nil NULL 
#endif 
5

auf einen Kommentar von @cobbal erweitern welcher der entsprechende Rahmen wurde geschrieben.

Für alles, was mit Objective-C verwandt ist, verwende ich Null. Zum Beispiel:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray { 
    if (anArray == nil) return NO; 

    // process elements 
    ... 
} 

Wenn jedoch von Datenmodellen aus einem C-Rahmen (wie Adressbuch Rahmen und Corefoundation) Prüfung der Gültigkeit, verwende ich NULL. Zum Beispiel:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord { 
    if (aRecord == NULL) return NO; 

    // set-up the ABUnknownPersonViewController and display it on screen 
    .. 
} 

Auf diese Weise habe ich die subtilen Hinweisen in meinem Code, wenn ich mit Obj-C oder C-basiertem Code zu tun habe.

3

Wie bereits erwähnt, sind sie gleich, aber ich benutze entweder die eine oder die andere je nach Sprache in

10

Ich habe folgendes gefunden:

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 */ 

So wie es aussieht, gibt es keinen Unterschied, sondern einen konzeptionellen.

5

Sie beide sind nur typecast Nullen. Funktional gibt es keinen Unterschied zwischen ihnen. dh.,

Es gibt einen Unterschied, aber nur für Sie selbst und andere Menschen, die den Code lesen, kümmert sich der Compiler nicht.

Noch eine Sache Nil ist ein Objektwert, während NULL ein generischer Zeigerwert ist.

0

Verwenden Sie NULL zum Beispiel, wenn Sie eine Objective-C-Methode mit einem Ausgabeparameter vom Typ (NSError **) aufrufen.

Ich sehe eine Menge Beispielcode im Web, wo Menschen in diesem Fall Nil anstelle von NULL liefern. Dies liegt daran, dass es sich um einen Zeiger auf einen Zeiger und somit nicht direkt um einen Objective-C-Objekttyp handelt. Wie oben erwähnt, sollte nil für Objective-C-Objekttypen verwendet werden.

24

Null ist ein leerer Wert, der an ein Objekt gebunden ist/entspricht (der ID-Typ in Objective-C). null habe keine Referenz/Adresse, nur ein leerer Wert.

NSString *str = nil; 

So sollte nil verwendet werden, wenn es sich um ein Objekt handelt.

if(str==nil) 
    NSLog("str is empty"); 

Jetzt NULL für nicht-Objektzeiger (wie ein C-Zeiger) in Objective-C verwendet. Wie null, NULL bekam keinen Wert noch Adresse.

char *myChar = NULL; 
struct MyStruct *dStruct = NULL; 

Also, wenn es eine Situation ist, wenn ich brauche, um meine struct (Strukturtyp Variable) überprüfen leer ist oder nicht, dann wird, verwende ich:

if (dStruct == NULL) 
    NSLog("The struct is empty"); 

Nehmen wir ein anderes Beispiel haben, die

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

Of Schlüssel-Wert-Beobachtung sollte der Rahmen ein C-Zeiger oder ein Objektverweis sein. Hier für den Kontext können wir nicht verwenden nil; wir müssen NULL verwenden. Die Klasse NSNull definiert ein Singleton-Objekt, das zur Darstellung von Nullwerten in Sammlungsobjekten (NSArray, NSDictionary) verwendet wird. Die [NSNull null] wird die Singleton-Instanz von NSNull zurückgeben. Grundsätzlich [NSNull null] ist ein richtiges Objekt.

Es gibt keine Möglichkeit, ein Nil-Objekt in ein Sammlungsobjekt einzufügen. Nehmen wir ein Beispiel haben:

NSMutableArray *check = [[NSMutableArray alloc] init]; 
[check addObject:[NSNull null]]; 
[check addObject:nil]; 

In der zweiten Zeile, werden wir keine Fehler bekommen, weil es vollkommen fair ist ein NSNull Objekt in eine Sammeltyp-Objekt einfügen. In der dritten Zeile erhalten wir den Fehler "Objekt kann nicht Null sein". Weil nil kein Objekt ist.

+0

+1 für die praktische Verwendung von Null/Null in Array. – Michael

4

In modernen OS X und iOS-SDKs:

  • nil und Nil und NULL identisch sind in Objective-C und in Objective-C++ vor C++ 11.
  • nil und Nil und sind identisch in Objective-C++ mit C++ 11.

Stilistisch bevorzugen viele Leute nil für Objective-C-Objekte und NULL oder nullptr für andere Zeigertypen zu verwenden. Ich selbst benutze jetzt nil überall.

[NSNull null] ist ein Objekt singleton Verwendung Nullwert in Situationen darstellen, in denen nil als Wert verboten ist (typischerweise in einer Sammelobjekt wie beispielsweise eine oder NSArrayNSDictionary). Number and Value Programming Topics: Using NSNull

2

Es gibt einen Unterschied in einigen Kontexten.

wörtlich Null ist ein Zeichen: ASCII 0.

Nil entspricht blank, kein Wert.

Abhängig vom Programmierkontext kann dies ein großer Unterschied sein.

6

Beachten Sie, dass if([NSNull null])true zurückgibt.

0

Null bedeutet Abwesenheit von Wert, während NULL kein Objekt darstellen,

NSArray * array = @ [@ "Hallo Welt!", @ 101, [NSNULL null]];

Hier ist [NSNULL null] ein Objekt, das kein Objekt bedeutet, gleichzeitig können Sie nicht nil hinzufügen, um die Abwesenheit eines Objekts anzuzeigen.

Sie können auch beide Null und [NSNUll null] für die Überprüfung verwenden.

0

Dies wird Ihnen helfen, den Unterschied zwischen Null, Null und Null zu verstehen.

Der Link unten in irgendeine Weise helfen können Ihnen:

http://nshipster.com/nil/

nil -> wörtlichen Nullwert für Objective-C-Objekte.

Nil -> literaler Nullwert für Objective-C-Klassen.

NULL -> literaler Nullwert für C-Zeiger.

NSNULL -> Singleton-Objekt zur Darstellung von null.

+0

fügt dies etwas Neues hinzu (was nicht durch die vorhandenen Antworten abgedeckt wird)? –

0

Grundsätzlich gilt: nil: Null-Zeiger auf ein Objekt und null: ist für eine andere Art Zeiger

0

nil ist ein Objektzeiger nichts. Obwohl sie sich semantisch von NULL unterscheiden, sind sie technisch äquivalent miteinander.

Auf der Framework-Ebene definiert Foundation NSNull, die eine Klassenmethode + null definiert, die das Singleton NSNull-Objekt zurückgibt. NSNull unterscheidet sich von nil oder NULL, dass es sich um eine tatsächliche Objekt ist, eher als ein Null-Wert.

Zusätzlich in Foundation/NSObjCRuntime.h, Nil als KlasseZeiger auf nichts festgelegt.

Refer this for further info - nil/Nil/NULL/NSNull