Este es un código de muestra:
NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)
if (myNumber == nil)
NSLog(@"test 1 myNumber == nil");
if (myNumber == NULL)
NSLog(@"test 2 myNumber == NULL");
if ([myNumber isEqual:[NSNull null]])
NSLog(@"test 3 myNumber == [NSNull null]");
¿Cuándo debo usar nil, NULL y [NSNull null]?
objective-c
null
nsnull
Biranchi
fuente
fuente
nil
significa una especie deNULL
instancia objc. Por lo tanto, puede marcar un valor específico para la instancia objc o el puntero genérico. En vista de la gestión de tipos y la seguridad, esto le ayudará mucho.nil
ynull
/NULL
son iguales, ambos definidos como cero. Como formalidad, úselanil
al codificar Objective-C yNULL
al codificar declaraciones / llamadas regulares de C / C ++.NSNull
Sin embargo, es algo completamente diferente. Es un objeto singleton que sirve como marcador de posición para representar "nada" en, por ejemplo, NSDictionarys donde no se permiten punteros nulos / nulos.Respuestas:
Puede usar
nil
en cualquier lugar que pueda usarnull
. La principal diferencia es que puede enviar mensajesnil
, por lo que puede usarlo en algunos lugares dondenull
no puede trabajar.En general, solo use
nil
.fuente
#define nil NULL
[NSNull null]
es una bestia muy diferente. Para citar de NSNull Class Reference , "La clase NSNull define un objeto singleton usado para representar valores nulos en objetos de colección (que no permiten valores nulos)". Consulte también la sección Uso de NSNull en Temas de programaciónNULL
.Se diferencian en sus tipos. Todos son cero, pero
NULL
es unvoid *
,nil
es unid
yNil
es un puntero de clase.fuente
NULL
vnil
, pero esto realmente pierde la marca re[NSNull null]
. Consulte la sección Uso de NSNull en Temas de programación de números y valores y Referencia de clase NSNull .void *
. Una respuesta diferente aquí ya menciona esto, pero si profundizasobjc.h
, encontrarás la línea#define nill __DARWIN_NULL
.nil es un valor vacío enlazado / correspondiente con un objeto (el tipo de identificación en Objective-C). nil no tiene referencia / dirección, solo un valor vacío.
Por lo tanto, debe usarse nil si se trata de un objeto.
Ahora NULL se usa para el puntero sin objeto (como un puntero en C) en Objective-C. Como nil , NULL no tiene valor ni dirección.
Entonces, si hay una situación, cuando necesito verificar que mi estructura (variable de tipo de estructura) está vacía o no, usaré:
Tengamos otro ejemplo, el
En la observación de valores clave , el contexto debe ser un puntero en C o una referencia de objeto. Aquí para el contexto no podemos usar nil ; Tenemos que usar NULL .
Finalmente, la clase NSNull define un objeto singleton usado para representar valores nulos en objetos de colección (NSArray, NSDictionary). El [NSNull nulo] voluntad devuelve la instancia singleton de NSNull. Básicamente [NSNull null] es un objeto apropiado.
No hay forma de insertar un objeto nulo en un objeto de tipo colección. Veamos un ejemplo:
En la segunda línea, no obtendremos ningún error, porque es perfectamente justo insertar un objeto NSNull en un objeto de tipo colección. En la tercera línea, obtendremos el error "el objeto no puede ser nulo". Porque nulo no es un objeto.
fuente
NULL y nil son iguales entre sí, pero nil es un valor de objeto, mientras que NULL es un valor de puntero genérico (
(void*)0
, para ser específico).[NSNull null]
es un objeto destinado a ser nulo en situaciones en las que no está permitido. Por ejemplo, no puede tener un valor nulo en un NSArray. Entonces, si necesita representar un "nulo", puede usarlo[NSNull null]
.fuente
He encontrado lo siguiente:
objc.h
_tipos.h
stddef.h
MacTypes.h
Por su aspecto, no hay diferencia sino conceptual.
fuente
Cuidado con que
if([NSNull null])
vuelvetrue
.fuente
Ambos son solo de tipo cero. Funcionalmente, no hay diferencia entre ellos. es decir.,
Hay una diferencia, pero solo para usted y otros humanos que leen el código, al compilador no le importa.
Una cosa más nula es un valor de objeto, mientras que NULL es un valor de puntero genérico.
fuente
En los modernos SDK de OS X e iOS:
nil
yNil
yNULL
son idénticos en Objective-C y en Objective-C ++ antes de C ++ 11.nil
yNil
ystd::nullptr
son idénticos en Objective-C ++ con C ++ 11.Estilísticamente, muchas personas prefieren usar
nil
para objetos Objective-C y /NULL
onullptr
para otros tipos de punteros. Yo mismo ahora uso ennil
todas partes.[NSNull null]
es un objeto singleton utilizado para representar valores nulos en situaciones dondenil
está prohibido como un valor (generalmente en un objeto de colección como unNSArray
oNSDictionary
). Temas de programación de números y valores: uso de NSNullfuente
Para ampliar un comentario de @cobbal:
MacTypes.h contiene:
fuente
Como ya se mencionó, son iguales, pero uso uno u otro dependiendo del idioma en el que se escribió el marco correspondiente.
Para todo lo relacionado con Objective-C, uso nil. Por ejemplo:
Sin embargo, cuando verifico la validez de los modelos de datos desde un marco C (como el marco de AddressBook y CoreFoundation), uso NULL. Por ejemplo:
De esta manera, tengo pistas sutiles en mi código si estoy tratando con código basado en Obj-C o C.
fuente
nil es un puntero de objeto a nada. Aunque son semánticamente distintos de NULL , son técnicamente equivalentes entre sí.
En el nivel de marco, Foundation define NSNull , que define un método de clase, + null, que devuelve el objeto Singleton NSNull. NSNull es diferente de nil o NULL , ya que es un objeto real , en lugar de un valor cero.
Además, en Foundation / NSObjCRuntime.h, Nil se define como un puntero de clase a la nada.
Consulte esto para obtener más información: nil / Nil / NULL / NSNull
fuente
Hay una diferencia en algunos contextos.
Literalmente, Null es un personaje: ASCII 0.
Nil es equivalente a blanco, sin valor.
Dependiendo del contexto de programación, esto puede ser una gran diferencia.
fuente
Utilice NULL, por ejemplo, cuando invoque un método Objective-C con un parámetro de salida de tipo (NSError **).
Veo muchos códigos de ejemplo en la web donde las personas proporcionan nulo en lugar de NULL en este caso. Esto se debe a que es un puntero a un puntero y, por lo tanto, no es directamente un tipo de objeto Objective-C. Como se dijo anteriormente, nil debe usarse para los tipos de objeto Objective-C.
fuente
Básicamente: nil: puntero nulo en un objeto y nulo: es para otro tipo de puntero
fuente
nil significa ausencia de valor mientras NULL representa No Object,
NSArray * array = @ [@ "Hello World!", @ 101, [NSNULL null]];
Aquí [NSNULL null] es un objeto que significa que no hay ningún objeto, al mismo tiempo no puede agregar nil para indicar la ausencia de objeto.
también puede usar nil y [NSNUll null] para verificar.
fuente
Esto lo ayudará a comprender la diferencia entre nulo, nulo y nulo.
El siguiente enlace puede ayudarlo de alguna manera:
http://nshipster.com/nil/
fuente