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.