NULL vs nulo no Objective-C

182

In observeValueForKeyPath:ofObject:change:context:- por que os documentos usam em NULLvez de nilquando não especificam um ponteiro de contexto?

erikprice
fonte
na minha opinião, objeto é nulo, classe é Nil e NULL usando para objeto ou classe #
Thanh Vũ Trần

Respostas:

227

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).

Paul Tomblin
fonte
2
Mas desde que o tipo de 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.
21009 erikprice
2
O tipo de contexto: nesse método é "nulo *". "nil" não é um "nulo *", mas NULL é.
21119 Paul Tomblin
3
Você pode. void * é qualquer ponteiro. No entanto, você está absolutamente certo de que NULL é a constante correta lá.
22711 Peter Hosey
3
Eles disseram nulo *. NULL é para nulo * e nulo é para id. Portanto, você passa NULL. Se você não passar nada, estará mentindo para o seu leitor, que pensará que esse método leva um ID.
31711 Peter Hosey
12
Ou, pensando de outra maneira, NULL é um tipo mais amplo e nulo é um subconjunto de NULL. Em geral, usar o tipo mais amplo que você pode sair com (ou seja, em Java, escrever o seu método para esperar uma coleção em vez de um vetor, a menos que você precisa de algo específico do vetor)
Paul Tomblin
65

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 *).

Marc Charbonneau
fonte
8
Além disso, NULLé definido de forma diferente de nil. nildefine-se como (id)0. NULLnão é.
14
@WTP se você ler através MacTypes.h, declara #define nulo NULL
jbat100
1
Isso é muito interessante. Parece que não importa além de pontos de estilo. É como SIM / VERDADEIRO e NÃO / FALSO.
Brennan
1
@Brennan, isso não é totalmente verdade, apenas porque nil é definido como NULL não significa que exista alguma outra implementação oculta nos bastidores. Por exemplo, IBAction é definido como nulo, mas tem um significado diferente ao usar o construtor de interface ao exibir métodos para anexar a ações em botões e outros.
Micaiah Wallace
53

Eles são tecnicamente a mesma coisa e diferem apenas em estilo:

  • O estilo Objective-C diz nilé o que usar para o idtipo (e ponteiros para objetos).
  • O estilo C diz que NULLé para isso que você usa void *.
  • O estilo C ++ normalmente diz que você deve apenas usar 0.

Normalmente, uso a variante que corresponde ao idioma em que o tipo é declarado .

Andrew
fonte
14

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.


fonte
4

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 *).

dan14941
fonte
1
Isso não é uma repetição dessa resposta existente ?
Pang