win32 img imagewriter imager for comando objective-c null nsnull

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 ).