2012-03-01 10 views
9

Estoy recibiendo alguna respuesta de JSON, y está trabajando muy bien, pero necesito para comprobar si hay algunos valores null,ios comprobar si NSArray == null

he encontrado diferentes respuestas, pero parece que no está funcionando todavía,

NSArray *productIdList = [packItemDictionary objectForKey:@"ProductIdList"]; 

he tratado con

if (!productIdList.count) //which breaks the app, 

if (productIdList == [NSNull null]) // warning: comparison of distinct pointer types (NSArray and NSNull) 

Entonces, ¿qué está sucediendo? ¿Cómo solucionar esto y verificar null en mi matriz?

Gracias!

+1

¿Qué quieres decir "frena la aplicación"? Si se trata de una excepción, publique los mensajes de registro. –

Respuesta

31

eliminar la advertencia mediante un reparto:

if (productIdList == (id)[NSNull null]) 

Si productIdList es, de hecho, [NSNull null], a continuación, haciendo productIdList.count elevará una excepción porque NSNull no entiende el mensaje count.

+0

@MaKo ... e, implícitamente, esto funciona porque '[NSNull null]' siempre devuelve el mismo objeto. '==' compara identidad, no valor. – Tommy

+0

Me perdí el elenco de 'id' y me faltaba este control (¡lo ignoré debido a la advertencia del compilador) durante mucho tiempo! ¡Gracias! – Jean

+0

Perfecto .. !! Gracias –

0

usted debe tener claro lo que desea comprobar: la matriz es nulo lo que significa que la variable no existe:


array == nil 

O la matriz tiene elemento cero, lo que puede:


[array count] == 0 
+0

La clase 'NSDictionary' no puede almacenar' nil' como un valor, por lo que los analizadores JSON (y los analizadores de listas de propiedades) usan '[NSNull null]' en su lugar para representar un valor nulo, porque hay una diferencia entre una clave presente con un valor nulo y una clave ausente. –

+0

Tienes razón. No vi que sea de JSON. – scorpiozj

+0

La primera línea dice todo. –

7

También puede verificar la clase de un objeto utilizando el método isKindOfClass:.

Por ejemplo, en el caso de que se podía hacer lo siguiente:

if ([productIdList isKindOfClass:[NSArray class]]) 
{ 
    // value is valid 
} 

o (si está seguro de que NSNull está indicando valor no válido)

if([productIdList isKindOfClass:[NSNull class]]) 
{ 
    // value is invalid 
} 
+0

Solo hay una instancia singleton de 'NSNull', por lo que se usa' == 'para comprobar si es más corta y más eficiente. –

+0

Pero comprobar el tipo de objeto devuelto es más seguro. – Nekto

6

Puede utilizar el selector de isEqual:

if ([productIdList isEqual:[NSNull null]]) 
Cuestiones relacionadas