El valor NULL
para Objective-C objetos (tipo id
) es nil
.
Mientras NULL
se utiliza para C punteros (tipo void *
).
(Al final ambos terminan sosteniendo el mismo valor (0x0
) Se diferencian en el tipo sin embargo..)
En Objective-C:
nil
(todo en minúsculas) es un puntero nulo a un objeto Objective-C.
Nil
(mayúscula) es un puntero nulo a una clase Objective-C.
NULL
(todos los casquillos) es un puntero nulo a cualquier otra cosa (C punteros, que es).
[NSNull null]
es un singleton para situaciones en las uso de nil no es posible (añadiendo/recepción nil a/desde NSArray
s por ejemplo)
En Objective-C++:
- Todo lo anterior, plus:
null
(minúsculas) o nullptr
(C++ 11 o posterior) es un puntero nulo a objetos C++.
Así, para comprobar contra nil
usted debe o comparar con nil
(o NULL
respectivamente) explícitamente:
if (getCaption == nil) ...
o dejar ObjC/C lo hace implícitamente para usted:
if (!getCaption) ...
Esto funciona como cada expresión en C (y con Objective-C ser un superconjunto de los mismos) tiene un valor booleano implícito:
expression != 0x0 => true
expression == 0x0 => false
Ahora, cuando la comprobación de NSNull
esto obviamente no funcionaría como [NSNull null]
devuelve un puntero a una instancia singleton de NSNull
, y no nil
, y por lo tanto no es igual a 0x0
.
Así, para comprobar contra NSNull
uno puede usar:
if ((NSNull *)getCaption == [NSNull null]) ...
o (preferido, ver comentarios):
if ([getCaption isKindOfClass:[NSNull class]]) ...
Tenga en cuenta que esta última (que utiliza una llamada del mensaje) devolverá false
si getCaption
es nil
, que, aunque formalmente correcto, puede no ser lo que espera/desea.
Por tanto, si uno (por cualquier razón) necesaria para cheque en contra de ambosnil
/NULL
yNSNull
, habría que combinar esos dos cheques:
if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...
Para obtener ayuda en la formación verificaciones positivas equivalentes ver De Morgan's laws y boolean negation.
Editar:NSHipster.com publicado recientemente un artículo sobre las diferencias sutiles entre nulo, nulo, etc.
¿Cuál es el tipo de datos de 'rowtwo'? ¿Por qué lo estás enviando '-valueForKey:'? –
Dejaré este comentario para referencia adicional: '-valueForKey:' es un método KVC. En KVC, '[NSNull null]' representa la ausencia de un valor para una clave dada. Si está utilizando un 'NSDictionary' en un contexto que no necesita KVC, use' -objectForKey: 'en su lugar - devolverá' nil' en lugar de '[NSNull null]' cuando una clave dada no esté presente en el diccionario. –
Consulte esta pregunta sobre desbordamiento de pila para ver una discusión sobre la diferencia entre '-valueForKey:' y '-objectForKey:': http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey -and-valueforkey –