2009-02-17 21 views
176

En observeValueForKeyPath:ofObject:change:context:, ¿por qué los documentos usan NULL en lugar de nil cuando no se especifica un puntero de contexto?NULL vs nil en Objective-C

+0

en mi opinión, el objeto es nulo, la clase es Nil y NULL usando para el objeto o clase –

Respuesta

221

nil solo debe usarse en lugar de id, lo que los programadores Java y C++ consideraríamos como un puntero a un objeto. Use NULL para punteros que no sean objetos.

consulte la declaración de ese método:

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

El contexto es un (es decir, un puntero al estilo C) void *, así que es definitivamente posible utilizar NULL (que se declara a veces como (void *)0) en lugar de nil (que es del tipo id).

+2

Pero dado que el tipo de 'context' en' observeValueForKeyPath: ofObject: change: context: 'es' void * ', ¿no significa eso que los datos pasados ​​como' context' podrían ser un puntero de objeto? Yo pensaría que es un caso común. Es por eso que estoy confundido sobre por qué los documentos siempre usan 'NULL' en lugar de' nil'. – erikprice

+2

El tipo de contexto: en ese método es "vacío *". "nil" no es un "vacío *", pero es NULL. –

+0

Entonces, ¿es correcto deducir de esta discusión que * no * podemos pasar un puntero de objeto (es decir, algo que puede escribirse como 'nil') cuando pasamos este mensaje al objeto que implementa NSKeyValueObserving? Porque los punteros a objetos no pueden ser del tipo 'void *'? – erikprice

63

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 c-style (void *).

+8

Además, 'NULL' se define de forma diferente que' nil'. 'nil' se define como' (id) 0'. 'NULL' no es. –

+14

@WTP si lee en MacTypes.h, declara #define nil NULL – jbat100

+1

Eso es muy interesante. Parece que no importa que no sea por puntos de estilo. Es como SÍ/VERDADERO y NO/FALSO. – Brennan

50

Son técnicamente lo mismo y sólo se diferencian en el estilo:

  • estilo de Objective-C dice nil es lo que va a utilizar para el tipo id (y punteros a objetos).
  • El estilo C dice que NULL es lo que usa para void *.
  • El estilo de C++ generalmente dice que solo debe usar 0.

Me suelen utilizar la variante que coincida con el idioma en el que el tipo es declarado .

+6

C++ 11 ahora usa nullptr en lugar de 0 para punteros nulos –

10

NULL es el C equivalent de nil, un puntero a la nada;

donde nil is zero typed as id,

NULL is zero typed as void*.

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

3

Casi son la misma cosa, excepto,

nil se utiliza en un estilo de Objective-C. donde NULL es para punteros tipo C y se tipifica como (void *).

+1

¿No es esto más o menos una repetición de [esta respuesta existente] (http://stackoverflow.com/questions/557582/null-vs-nil-in- objetivo-c/557607 # 557607)? – Pang

Cuestiones relacionadas