2011-07-25 25 views
8

Recibí un error como este - * Aplicación de finalización debido a una excepción no detectada 'NSInvalidArgumentException', razón: ** - [NSCFDictionary initWithObjects: forKeys: count:]: intento de insertar valor nil en los objetos [0] (clave: buscado)'¿Cuáles son las diferencias entre nil, NULL y [NSNULL nil]?

Luego probé el código de abajo

if (Obj == (id)[NSNull null]) //Obj is an id 
{ 
    NSLog(@" Obj is (id)[NSNull null]");  
} 
else if (Obj == nil) 
{ 
    NSLog(@"Obj is nil"); 
} 
else if (Obj == NULL) 
{ 
    NSLog(@"Obj is NULL"); 
} 
else 
{ 
    NSLog(@"Obj is something else"); 
} 

searchedDict = [NSDictionary dictionaryWithObject:Obj forKey:@"searched"]; 

y me dieron el mensaje de NSLog como 'obj es nil'.

Pero cuando utilicé el mismo código anterior cuando Obj era NSString y mi aplicación se canceló debido a su valor nulo, recibí el mensaje NSLog como 'Obj is (id) [NSNull null]'.

¿Cuáles son las diferencias entre nil, NULL y [NSNULL nil]?

¿Hay diferentes tipos de valores nulos? En caso afirmativo, ¿Cómo verificar comúnmente estos valores nulos?

Gracias :-)

+0

posible duplicado de [iphone + Diferencia entre nil, NIL y null] (http://stackoverflow.com/questions/5908936/iphonedifference-between-nil-nil-and- nulo) –

Respuesta

19

NULL es el valor original de estilo C dado a un puntero que se considera que apunta a ninguna dirección explícita. En general, solo se usa para indicar "desarmado" o como sentinel value.

char * oldstring = NULL; 

nil es la versión Objetivo-c del mismo que se aplica a Obj-C referencias a objetos:

NSString * str = nil; 
id foo = nil; 

Se definen tanto a ser igual al valor cero, y aunque podría utilizarlos de forma intercambiable, el primero se ve principalmente dentro de Obj-C para punteros tradicionales (como establecer void * punteros de contexto en NULL) y nil se utiliza para todas las referencias de objeto Obj-C.

La diferencia existe porque, aunque la sintaxis de Obj-C pasa por encima de las C, el diseño del lenguaje es de nivel superior, y sus ID de objeto aren't conceptually the same como solo "punteros". De ahí la creación de un centinela especial para ellos.

[NSNull null] es un objeto that is intended ser usos en muy ciertos casos (como la inserción en colecciones) donde se desea un valor de "no-valor", pero real nil no está permitido, y un objeto debe ser utilizado.

Tenga en cuenta que nil y NSNull stringify muy parecida: nil stringifies como (null) y NSNull como <null>.

+0

Gracias ..... :) –

5

[NSNull null] es un contenedor para el valor nil que desea insertar en la colección, si es lo que desea.

NSNull clase de referencia.

También puede verificar si una referencia de objeto es nil simplemente con ==.

También nil se define como: #define nil NULL y es el objetivo C equivalente para C NULL.

+0

Gracias por una respuesta rápida :) bien, revisé la 'referencia de clase NSNull'. ¿Son nulos y NULL diferentes? –

+0

@ S.Philip - no 'nil' es solo otra forma de decir' NULL' según su definición –

+0

Gracias ..... :) –

1

Cero es para punteros de objeto

NULL es para no punteros

[nulo NSNull] es un objeto para representar "nulo" para ser utilizado en los casos en que NIL valores no son permitidos (como ha señalado Vince, como en colecciones, por ejemplo, NSArray y NSDictionary)

+0

Gracias ..... :) –

Cuestiones relacionadas