objective c - img - ¿Son NULL y nil equivalentes?
img to usb (6)
Asegúrese de escribir [NSNull null] al tipo de objeto que está comparando
NSArray list;
if(list==(NSArray *)[NSNull null])
// do something
de lo contrario, recibirá un mensaje de advertencia que dice "Comparación de distintos tipos de punteros (''tipo *'' y ''NSNull *'')
De hecho, mi pregunta aquí es: ¿son null
y nil
equivalentes o no?
Tengo un ejemplo pero estoy confundido cuando son iguales cuando no lo son.
NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
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");
}
}
Aquí, en el caso anterior, muestra que tanto null
como nil
no son iguales y muestra "igual a la instancia de NSNull"
NSString *str=NULL;
id str1=nil;
if(str1 == str)
{
printf("/n IS EQUAL........");
}
else
{
printf("/n NOT EQUAL........");
}
Y en el segundo caso, muestra que ambos son iguales y muestra "ES IGUAL".
La ayuda de cualquiera será muy apreciada.
Gracias, Monish.
De http://www.iphonedevsdk.com/forum/iphone-sdk-development/34826-nil-vs-null.html
nil
y NULL
son 100% intercambiables.
Desde:
-
NULL
es para punteros de memoria de estilo C. -
nil
es para objetos Objective-C. -
Nil
es para las clases de Objective-C.
Siempre que escriba el código Objective-C, use nil
Cuando escriba el código C, use NULL
Pero en última instancia, todos se definen como lo mismo (no válido), creo, así que en la práctica no importa.
El concepto es el mismo, con la diferencia de que es válido enviar mensajes (método de llamada) a cero.
NSNull es una clase real (singleton), que puede usarse para matrices o diccionarios, que no aceptan valores NULL o nulos.
La mayor diferencia entre ellos: enviar un mensaje a un objeto NSNULL
probablemente causará un bloqueo, mientras que es bueno enviar cualquier mensaje a nil
. Por ejemplo, si usa una ruta de acceso clave para obtener una matriz, así:
NSArray *departmentNames = [departments valueForKey:@"name"];
Luego, tendrá un objeto NSNULL
para cualquier departamento cuyo name
sea nil
. Por lo tanto, esto va a causar un accidente:
for (NSString *name in departmentNames)
NSLog(@"%@", [name lowercaseString]);
siempre que el name
sea NSNull
, porque acaba de enviar un selector desconocido ( NSNull
) a un NSNull
.
Lección: compruebe el objeto NSNull
en una matriz antes de enviar cualquier mensaje a sus elementos.
for (NSString *name in departmentNames)
if (name != [NSNull null])
NSLog(@"%@", [name lowercaseString]);
No, NSNull
y nil
no son lo mismo. Ambos representan una falta de valor y es posible que desee tratarlos de la misma manera, pero todavía no son iguales.
La instancia de objeto NSNull
representa un valor nulo, por ejemplo, cuando lee datos de una base de datos que tiene valores nulos.
El valor nil
es un puntero nulo, es decir, no apunta a ninguna instancia de objeto.
En tu segundo código no tienes ninguna instancia de NSNull
. Un puntero NSString
que contiene un puntero nulo no es una instancia de NSNull
, es solo un puntero nulo. Estás comparando un puntero nulo a otro, y por supuesto son iguales.
nil
y NULL
son esencialmente lo mismo, nil
es algo como (NSObject *)0
, mientras que NULL
es más como (void *)0
. Pero ambos son punteros con un valor entero de cero. Puede enviar mensajes a nil
sin generar un error.
NSNull
y NULL
(o nil
, por supuesto) son cosas diferentes, sin embargo. Solo usa NSNull
como ayudante para agregar un objeto empty
a una NSArray
u otra clase contenedora, ya que no puede agregarles nada. Entonces, en cambio, utiliza [NSNull null]
como reemplazo, y debe verificar si un elemento de la matriz es NSNull
, no si es nil
(nunca será igual a nil
).