2011-11-14 8 views
8

Duplicar posibles:
What's the difference between [NSNull null] and nil?
What are the differences between nil, NULL and [NSNULL nil]?algunas confusiones acerca de [nulo NSNull], nil

1.

id dicValue = [aDictionary objetForKey:@"aKey"]; 

if(dicValue != nil) 
{ 
    blablala... 
} 

o

2.

if(dicValue != [NSNull null]) 
{ 
    blablala... 
} 

debe elegir la primera o la segunda?

o cuando se trata de esta manera:

3.

if ([aDictionary objetForKey:@"aKey"] != nil) 

o

4.

if ([aDictionary objetForKey:@"aKey"] != [NSNull null]) 

y lo nuevo?

1.2.3.4. que es correcto y recomendado?

Respuesta

18

Directamente desde Apple Documentation.
La clase NSNull define un objeto singleton que se usa para representar valores nulos en situaciones donde nil está prohibido como valor (normalmente en un objeto de colección como una matriz o un diccionario).

NSNull *nullValue = [NSNull null]; 
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue]; 
NSLog(@"arrayWithNull: %@", arrayWithNull); 
// output: "arrayWithNull: (<null>)" 

Es importante apreciar que la instancia NSNull es semánticamente diferente de NO o de falsos estos tanto representar un valor lógico; la instancia NSNull representa la ausencia de un valor. La instancia de NSNull es semánticamente equivalente a cero, sin embargo, también es importante apreciar que no es igual a cero. Para probar un valor de objeto nulo, debe hacer una comparación directa de objetos.

id aValue = [arrayWithNull objectAtIndex:0]; 
if (aValue == nil) { 
    NSLog(@"equals nil"); 
} else if (aValue == [NSNull null]) { 
    NSLog(@"equals NSNull instance"); 
    if ([aValue isEqual:nil]) { 
     NSLog(@"isEqual:nil"); 
    } 
} 
// output: "equals NSNull instance" 

¿Está claro ahora?

+0

tipo de, ¡gracias! – Patrick

+0

esto ayudó mucho gracias! estaba buscando operadores de comparación en todo SO – Jake

0

En este caso, debe usar el primero; o más bien, una ligera variación:

if (dicValue) { 
    // blablabla... 
} 

NSNull es para su uso cuando se necesita un objeto válido, por ejemplo, para su uso como una clave de diccionario, entrada de la matriz, o similar.

nil es igual a (id)NULL; generalmente se toma como "Sin valor".

[NSNull null], por otro lado, es un objeto que contiene un valor vacío; tomado para significar "Un valor de Ninguno".

Muy pocos métodos devuelven un valor de NSNull, y generalmente solo se encuentra si lo introduce usted mismo.

Existe principalmente porque nil no se puede insertar en las matrices; y funciona como un marcador vacío para las matrices que lo requieren.


En una nota relacionada; la parte "!= nil" de su expresión es redundante; cualquier puntero válido a un objeto se evalúa como verdadero en una expresión booleana y nil se evalúa como falso.

+0

3q, sé que es redundante, pero todavía me gusta agregar la parte "! = Nil". Esto hace que el código sea fácil de leer. ¿Lo crees? :) – Patrick

1

El primero significa que no hay tal clave, en segundo lugar significa que el valor de clave es NSNull

+0

¡Esto está muy claro, 3q! – Patrick

3

Mi entendimiento es que NSNull es un objeto que representa un valor NULL y nula es sólo un puntero de vacío.

Puede llenar un NSArray con objetos NSNull y devolverá valores nulos, pero no puede llenarlo con nils.

Usted puede hacer

[myNsMutableArray addObject:[NSNull null]]; 

pero esto se estrellaría:

[myNsMutableArray addObject:nil]; 

mismo modo:

[[NSMutableArray alloc] initWithObjects:@"1", nil, @"2", nil]; 
[[NSMutableArray alloc] initWithObjects:@"1", [NSNull null], @"2", nil]; 

La primera matriz, cuando se imprimen haría salida "1" El segundo saldría: "1, nulo, 2"

Para que pueda usar NSNull para representar espacios vacíos en una matriz.

No puede insertar nil en un diccionario. Entonces, verificarlo significa que la clave no existe. Si comprueba NSNull, significa que la clave existe pero contiene un valor vacío (NSNull).

+0

3q, ¡esto ayuda mucho! – Patrick

+0

Me alegra que sí. Acepte la respuesta entonces :) – Odrakir

Cuestiones relacionadas