NULL gegen Null in Ziel-C

182

In observeValueForKeyPath:ofObject:change:context:- warum werden die Dokumente verwendet, NULLanstatt nilkeinen Kontextzeiger anzugeben?

erikprice
quelle
Meiner Meinung nach ist Objekt Null, Klasse ist Null und NULL für Objekt oder Klasse
Thanh Vũ Trần

Antworten:

227

nilsollte nur anstelle von verwendet werden id, was wir Java- und C ++ - Programmierer als Zeiger auf ein Objekt betrachten würden. Verwendung NULLfür Nicht-Objekt-Zeiger.

Schauen Sie sich die Deklaration dieser Methode an:

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

Der Kontext ist ein void *(dh ein Zeiger im C-Stil), daher würden Sie definitiv NULL(was manchmal als deklariert wird (void *)0) anstelle von nil(was vom Typ ist id) verwenden.

Paul Tomblin
quelle
2
Bedeutet das nicht, dass die als übergebenen Daten ein Objektzeiger sein könnten, da der Typ von contextin observeValueForKeyPath:ofObject:change:context:ist ? Ich würde denken, dass dies ein häufiger Fall ist. Deshalb bin ich verwirrt darüber, warum die Dokumente immer statt verwenden . void *contextNULLnil
Erikprice
2
Die Art des Kontexts: In dieser Methode ist "void *". "nil" ist keine "void *", aber NULL.
Paul Tomblin
3
Sie können. void * ist ein beliebiger Zeiger. Trotzdem haben Sie absolut Recht, dass NULL dort die richtige Konstante ist.
Peter Hosey
3
Sie sagten nichtig *. NULL steht für void * und nil steht für id. Daher übergeben Sie NULL. Wenn Sie Null bestehen, belügen Sie Ihren Leser, der glaubt, dass diese Methode eine ID benötigt.
Peter Hosey
12
Oder anders ausgedrückt: NULL ist ein breiterer Typ und nil ist eine Teilmenge von NULL. Verwenden Sie im Allgemeinen den breitesten Typ, mit dem Sie durchkommen können (dh schreiben Sie in Java Ihre Methode, um eine Sammlung anstelle eines Vektors zu erwarten, es sei denn, Sie benötigen etwas Bestimmtes von Vector)
Paul Tomblin
65

Sie sind technisch identisch (0), aber nil wird normalerweise für einen Objective-C-Objekttyp verwendet, während NULL für Zeiger im C-Stil (void *) verwendet wird.

Marc Charbonneau
quelle
8
Auch NULList anders definiert als nil. nilist definiert als (id)0. NULList nicht.
14
@WTP Wenn Sie MacTypes.h lesen, deklariert es #define nil NULL
jbat100
1
Das ist sehr interessant. Es scheint, dass es keine andere Rolle spielt als für Stilpunkte. Es ist wie JA / WAHR und NEIN / FALSCH.
Brennan
1
@Brennan, das ist nicht ganz richtig, nur weil nil als NULL definiert ist, heißt das nicht, dass es hinter den Kulissen eine andere versteckte Implementierung gibt. Beispielsweise ist IBAction als ungültig definiert, hat jedoch eine andere Bedeutung, wenn der Schnittstellen-Generator verwendet wird, wenn Methoden zum Anhängen an Aktionen auf Schaltflächen und dergleichen angezeigt werden.
Micaiah Wallace
53

Sie sind technisch gleich und unterscheiden sich nur im Stil:

  • Der Objective-C-Stil nilgibt an, was für den idTyp (und Zeiger auf Objekte) verwendet werden soll.
  • C-Stil sagt, dass NULLSie dafür verwenden void *.
  • Der C ++ - Stil besagt normalerweise, dass Sie nur verwenden sollten 0.

Normalerweise verwende ich die Variante, die der Sprache entspricht, in der der Typ deklariert ist .

Andrew
quelle
14

NULList das C equivalentvon nil, ein Zeiger auf nichts;

wo nil is zero typed as id,

NULL is zero typed as void*.

Ein wichtiger Punkt, an den Sie keine Nachricht an NULL senden können. Daher wird an vielen Stellen bevorzugt Null in Objektiv C verwendet.


quelle
4

Sie sind fast dasselbe, außer:

nilwird in einem Objective-C-Stil verwendet. wo NULList für Zeiger vom Typ C und ist typdefiniert für (void *).

dan14941
quelle
1
Ist das nicht so ziemlich eine Wiederholung dieser bestehenden Antwort ?
Pang