2010-11-26 18 views
25

Como dice el título, ¿cuál es la diferencia entre NULL, nil y @""?Objective-C: ¿Cuál es la diferencia entre NULL, nil y @ ""?

Por ejemplo, si quiero verificar que una cadena en un diccionario esté vacía.

¿Qué condición debo usar?

if ([dictionary objectForKey:@"aString"] == nil) 

o

if [[dictionary objectForKey:@"aString"] isEqualToString:@""] 

o

if ([dictionary objectForKey:@"aString"] == NULL) 

¿Cuál es la correcta?

+4

valueForKey: es para la codificación de valores clave. Debería usar objectForKey: para obtener cosas de un diccionario. Aunque hace casi lo mismo, es marginalmente más rápido y funciona correctamente para las claves que comienzan con un signo @. – JeremyP

Respuesta

31

nil es el análogo de NULL para object-c objects. En realidad son la misma cosa:

//MacTypes.h 
#define nil NULL 

Así

if ([dictionary valueForKey:@"aString"]==nil) 
if ([dictionary valueForKey:@"aString"]==NULL) 

el registro de entrada si la clave específica está presente en un diccionario, aunque primera línea es más correcta, ya que comprueba los tipos de Objective-C.

Acerca de:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""]) 

comprueba esta línea si hay una entrada en el diccionario con "laCadena" clave y la compara con la entrada cadena vacía. El resultado será una de las siguientes:

  • es falso si no hay tal entrada para su clave
  • es cierto si no hay entrada para su llave y que la entrada es una cadena vacía
  • puede bloquearse si el objeto de existe la clave y no responde a -isEqualToString: mensaje

Así que dependiendo de sus necesidades debe utilizar primero la línea, o si es necesario combinar tanto comprobar si existe la entrada y no es una cadena vacía, entonces necesita 2 condiciones :

if ([dictionary valueForKey:@"aString"]==nil || 
       [[dictionary valueForKey:@"aString"] isEqualToString:@""]) 
5

valueForKey: (y la mayoría de los demás métodos Cocoa) devuelve un puntero (dirección de memoria) a un objeto. Cuando usa el símbolo ==, simplemente prueba el valor numérico de ese puntero y no el valor real de la cadena. Cuando usa isEqualToString:, está probando el valor.

Estos dos:

if ([dictionary valueForKey:@"aString"]==nil) 
if ([dictionary valueForKey:@"aString"]==NULL) 

son más o menos equivalentes y ambos prueba "fue la dirección devuelta igual a cero?", Que es como valueForKey: indica que no había objeto encontrado para esa tecla. Si el diccionario contiene cualquier objeto para esa clave, independientemente de su valor (por ejemplo, incluso una cadena vacía), esta instrucción if devuelve falso.

(normalmente utiliza la versión nil en Objective-C, como una convención estilo tanto como cualquier otra cosa)

Este:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""]) 

prueba el valor real de la cadena para ver si se trata de una cadena de longitud cero. Si no hay ningún objeto en el diccionario, devolverá falso, ya que cuando llama al isEqualToString: (o casi cualquier otro método) contra un puntero nil siempre obtiene cero o falso.

15

nil se utiliza para representar un puntero nulo a un objeto Objective-C. Nil se utiliza para representar un puntero nulo a una clase Objective-C. NULL se utiliza para representar un puntero nulo a cualquier otra cosa.

Todos estos, tienen el valor numérico de 0. Son todos cero, pero "NULO" es un vacío *, "nulo" es un id y "Nil" es un puntero de clase.

@ "" se usa para denotar una cadena vacía, o decir una cadena cuya longitud es CERO.

1

"La clase NSNull define un objeto singleton que se usa para representar valores nulos en situaciones donde nil está prohibido como un valor (normalmente en un objeto de colección como una matriz o un diccionario)." Puedes usar nil en cualquier lugar donde puedas usar null. La principal diferencia es que puede enviar mensajes a cero, para que pueda usarlo en algunos lugares donde null no funciona. En general, solo usa nil. eso es exactamente lo que está sucediendo, el programador elige colocar un objeto nulo en la matriz de controladores, donde nil no está permitido como valor.

Es más una referencia contextual donde NULL es un puntero a 0x0, nil es un objeto object-c inexistente y Nil es una clase object-c inexistente, pero técnicamente son todos 0. Además, es NULL no null - null es en Java o C#, pero no en Objective-C

o aliviar las formas u decir

Son todos iguales a cero, pero "nULO" es un void *, "nulo" es un id, y "Nil" es un puntero de clase.

18
nil == (id) 0 
Nil == (Class) 0 
NULL == (void *) 0 

@ "" es una constante de NSString vacía.

0

Ninguna y NULL indican la inexistencia
@ "" indica la existencia y que está vacío

Cuestiones relacionadas