Risposte:
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).
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.
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 *).
Tecnicamente sono la stessa cosa e differiscono solo per stile:
nilche cosa usare per il idtipo (e i puntatori agli oggetti).NULLè quello che usi void *.0.In genere utilizzo la variante che corrisponde alla lingua in cui viene dichiarato il tipo .
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.
Sono quasi la stessa cosa tranne,
nilviene utilizzato in uno stile Objective-C. dove NULLè per i puntatori di tipo C ed è tipizzato (void *).