NULL vs nil en Objective-C

182

En observeValueForKeyPath:ofObject:change:context:: ¿por qué usan los documentos en NULLlugar de nilcuando no se especifica un puntero de contexto?

erikprice
fuente
en mi opinión, el objeto es nulo, la clase es nula y NULL usando para objeto o clase
Thanh Vũ Trần

Respuestas:

227

nilsolo debe usarse en lugar de un id, lo que los programadores de Java y C ++ pensaríamos como un puntero a un objeto. Úselo NULLpara punteros que no sean objetos.

Mira la declaración de ese método:

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

El contexto es un void *(es decir, un puntero de estilo C), por lo que definitivamente usaría NULL(que a veces se declara como (void *)0) en lugar de nil(que es de tipo id).

Paul Tomblin
fuente
2
Pero dado que el tipo de contextin observeValueForKeyPath:ofObject:change:context:es void *, ¿no significa eso que los datos pasados ​​como contextpodrían ser un puntero de objeto? Creo que ese es un caso común. Es por eso que estoy confundido sobre por qué los documentos siempre usan en NULLlugar de nil.
erikprice
2
El tipo de contexto: en ese método es "void *". "nil" no es un "vacío *", pero NULL sí.
Paul Tomblin
3
Usted puede. void * es cualquier puntero. Sin embargo, tiene toda la razón en que NULL es la constante correcta allí.
Peter Hosey
3
Dijeron vacío *. NULL es para void * y nil es para id. Por lo tanto, pasa NULL. Si pasa cero, está mintiendo a su lector, quien pensará que este método requiere una identificación.
Peter Hosey
12
O, para pensarlo de otra manera, NULL es un tipo más amplio y nil es un subconjunto de NULL. En general, use el tipo más amplio con el que pueda salirse con la suya (es decir, en Java, escriba su método para esperar una Colección en lugar de un Vector, a menos que necesite algo específico de Vector)
Paul Tomblin
65

Técnicamente son lo mismo (0), pero nil se usa generalmente para un tipo de objeto Objective-C, mientras que NULL se usa para punteros de estilo c (void *).

Marc Charbonneau
fuente
8
Además, NULLse define de manera diferente que nil. nilse define como (id)0. NULLno lo es
14
@WTP si lees MacTypes.h, declara #define nil NULL
jbat100 el
1
Eso es muy interesante. Parece que no importa más que para los puntos de estilo. Es como SÍ / VERDADERO y NO / FALSO.
Brennan
1
@Brennan, eso no es del todo cierto, solo porque nulo se define como NULL no significa que haya alguna otra implementación oculta detrás de escena. Por ejemplo, IBAction se define como nulo pero tiene un significado diferente cuando se usa el generador de interfaces cuando se muestran métodos para adjuntar acciones a botones y demás.
Micaiah Wallace
53

Técnicamente son lo mismo y difieren solo en estilo:

  • El estilo Objective-C dice nilqué usar para el idtipo (y los punteros a los objetos).
  • El estilo C dice que eso NULLes lo que usas void *.
  • El estilo C ++ generalmente dice que solo debes usar 0.

Normalmente uso la variante que coincide con el idioma donde se declara el tipo .

Andrés
fuente
14

NULLes el C equivalentde nil, un puntero a nada;

donde nil is zero typed as id,

NULL is zero typed as void*.

Un punto importante que no puede enviar un mensaje a NULL. Por lo tanto, se prefiere usar nil en el objetivo-C en muchos lugares.


fuente
4

Casi son lo mismo excepto,

nilse usa en un estilo Objective-C. donde NULLes para punteros de tipo C y está tipificado como (void *).

dan14941
fuente
1
¿No es esto una repetición de esta respuesta existente ?
Pang