Respostas:
nildeve ser usado apenas no lugar de um id, o que nós, programadores Java e C ++, consideraríamos como um ponteiro para um objeto. Use NULLpara ponteiros que não são objetos.
Veja a declaração desse método:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
O contexto é um void *(ou seja, um ponteiro no estilo C), então você definitivamente usaria NULL(que às vezes é declarado como (void *)0) e não nil(que é do tipo id).
contextno observeValueForKeyPath:ofObject:change:context:é void *não, isso significa que os dados passados como o contextpoderia ser um ponteiro de objeto? Eu acho que esse é um caso comum. É por isso que estou confuso sobre o motivo pelo qual os documentos sempre usam em NULLvez de nil.
Eles são tecnicamente a mesma coisa (0), mas nil geralmente é usado para um tipo de objeto Objective-C, enquanto NULL é usado para ponteiros no estilo c (void *).
Eles são tecnicamente a mesma coisa e diferem apenas em estilo:
nilé o que usar para o idtipo (e ponteiros para objetos).NULLé para isso que você usa void *.0.Normalmente, uso a variante que corresponde ao idioma em que o tipo é declarado .
NULLé o C equivalentde nil, um ponteiro para o nada;
onde nil is zero typed as id,
NULL is zero typed as void*.
Um ponto importante que você não pode enviar uma mensagem para NULL. Portanto, é preferível usar zero na objetiva-C em muitos locais.
Eles quase são a mesma coisa, exceto,
nilé usado no estilo Objective-C. onde NULLé para ponteiros do tipo C e é tipificado para (void *).