NULL vs zero in Objective-C


182

In observeValueForKeyPath:ofObject:change:context:- perché i documenti usano NULLinvece di nilquando non si specifica un puntatore di contesto?


a mio avviso, l'oggetto è zero, la classe è zero e NULL utilizza per oggetto o classe
Thanh Vũ Trần

Risposte:


227

nildovrebbe essere usato solo al posto di un id, quello che noi programmatori Java e C ++ considereremmo come un puntatore a un oggetto. Utilizzare NULLper puntatori non oggetto.

Guarda la dichiarazione di quel metodo:

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

Il contesto è un void *(cioè un puntatore in stile C), quindi useresti sicuramente NULL(che a volte viene dichiarato come (void *)0) anziché nil(che è di tipo id).


2
Ma poiché il tipo di contextin observeValueForKeyPath:ofObject:change:context:è void *, ciò non significa che i dati passati come contextpotrebbero essere un puntatore a oggetto? Penso che sia un caso comune. Ecco perché sono confuso sul perché i documenti usano sempre NULLanziché nil.
erikprice,

2
Il tipo di contesto: in quel metodo è "void *". "zero" non è un "vuoto *", ma NULL lo è.
Paul Tomblin,

3
Puoi. void * è qualsiasi puntatore. Tuttavia, hai assolutamente ragione che NULL è la costante corretta lì.
Peter Hosey,

3
Hanno detto nulla *. NULL è per void * e nil è per id. Pertanto, si passa NULL. Se passi zero, stai mentendo al tuo lettore, che penserà che questo metodo prenda un id.
Peter Hosey,

12
O per pensarci in un altro modo, NULL è un tipo più ampio e nil è un sottoinsieme di NULL. In generale, usa il tipo più ampio con cui puoi cavartela (es. In Java, scrivi il tuo metodo per aspettarti una raccolta anziché un vettore, a meno che tu non abbia bisogno di qualcosa di specifico da Vector)
Paul Tomblin,

65

Tecnicamente sono la stessa cosa (0), ma in genere zero viene utilizzato per un tipo di oggetto Objective-C, mentre NULL viene utilizzato per i puntatori di tipo c (void *).


8
Inoltre, NULLè definito diversamente da nil. nilè definito come (id)0. NULLnon lo è.

14
@WTP se leggi MacTypes.h, dichiara #define nil NULL
jbat100

1
È molto interessante. Sembra che non abbia importanza se non per i punti di stile. È come SÌ / VERO e NO / FALSO.
Brennan,

1
@Brennan, Non è del tutto vero, solo perché zero è definito come NULL non significa che ci sia qualche altra implementazione nascosta dietro le quinte. Ad esempio, IBAction è definito come nullo ma ha un significato diverso quando si utilizza il builder di interfacce quando si visualizzano i metodi da allegare alle azioni sui pulsanti e simili.
Micaiah Wallace,

53

Tecnicamente sono la stessa cosa e differiscono solo per stile:

  • Lo stile Objective-C dice nilche cosa usare per il idtipo (e i puntatori agli oggetti).
  • Lo stile C dice che NULLè quello che usi void *.
  • Lo stile C ++ in genere dice che dovresti semplicemente usare 0.

In genere utilizzo la variante che corrisponde alla lingua in cui viene dichiarato il tipo .


14

NULLè il C equivalentdi nil, un puntatore a nulla;

dove nil is zero typed as id,

NULL is zero typed as void*.

Un punto importante che non puoi inviare un messaggio a NULL. Quindi si preferisce usare lo zero in obiettivo-C in molti punti.


4

Sono quasi la stessa cosa tranne,

nilviene utilizzato in uno stile Objective-C. dove NULLè per i puntatori di tipo C ed è tipizzato (void *).


1
Non è praticamente una ripetizione di questa risposta esistente ?
Ha
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.