objective-c - tutorial - svydesign
Diferencia entre nil, NIL y null en Objective-C (6)
Esto te ayudará a entender la diferencia entre nil, NIL y null.
Los tres de estos valores representan valores nulos o de cero puntero. La diferencia es que mientras NULL representa cero para cualquier puntero, nil es específico para los objetos (p. Ej., Id) y Nil es específico para los punteros de clase. Debería considerarse una buena práctica utilizar el objeto nulo correcto en la circunstancia correcta para fines de documentación, aunque no haya nada que impida que alguien mezcle y haga coincidir a medida que avanzan.
El siguiente enlace puede ayudarte de alguna manera:
Aquí hay una parte importante del enlace:
Quiero saber la diferencia entre nil
, NIL
y null
. Busqué en Google y encontré esto:
nil
-> puntero nulo al objeto Objective-C
NIL
-> puntero nulo a la clase Objective-C
null
-> puntero nulo al tipo primitivo o ausencia de datos
Pero no puedo entender claramente los términos "Objective-C object" y "class".
Por favor explícame esto. Además, ¿hay alguna palabra como NSNull
o NSNil
en Objective-C? Si es así, explique para qué es.
No estoy seguro, pero creo que solo debería usarse en lugar de una id
, lo que los programadores Java y C ++ pensarían como un pointer
a un object
. Use NULL
para punteros que no sean objetos.
nil
se usa generalmente para un tipo de objeto Objective-C, mientras que NULL
se usa para punteros estilo c
Supongamos que tiene una clase MyClass
por convenio. nil
se usa si desea inicializar su instancia a un valor nulo (igual que null
en java), es decir,
MyClass *obj = nil;
y si desea inicializar un puntero primitivo a valor nulo (igual que en c) usa
int *ptr = NULL;
y si desea inicializar a la referencia de Class
a valor nulo (igual que null
en java), utilice
Class classRefOfMyClass = Nil;
Es solo una convención de lo contrario Nil o nil tienen el mismo significado y tal vez NULL, nil o Nil son todos iguales.
Aquí está la definición de estos en el archivo objc.h
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
Y en stddef.h
#define NULL ((void*)0)
Y la definición de __DARWIN_NULL
en _types.h
#define __DARWIN_NULL ((void *)0)
Entonces no hay diferencia lógicamente. La idea principal aquí es inicializar un puntero, ya sea C
o Objective-C
a 0
. Si tiene conocimiento de C
entonces puede asignar
int *ptr = 0;
sin tipo fundición 0
a un puntero. Como no necesita encasillar 0
para asignarlo a un puntero.
En resumen, todos son 0
y nada más.
nil, NIL y nulo. depende de su requerimiento
NSNull
colecciones como NSArray
y NSDictionary
no pueden contener valores nulos.
NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary];
MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey"
NSLog(@"Keys: %@", [mutableDictionary allKeys]);
nulo
todos los apuntadores que tiene objeto a otros objetos comienzan como cero, por lo que no es necesario, por ejemplo, establecer self. (association) = nil en los métodos init.
En otros lenguajes, como C ++, esto bloquearía su programa, pero en Objective-C, invocar un método en nil devuelve un valor cero.
if (name != nil)
{
........
}
Símbolo Valor Significado
nil (id) 0 valor literal nulo para objetos Objective-C
Nulo (Clase) 0 valor nulo literal para las clases Objective-C
nil
es el valor literal nulo para los objetos Objective-C, que corresponde al tipo de id
abstracto o cualquier tipo de Objective-C declarado a través de @interface
. Por ejemplo:
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // do something
Nil
es el valor literal nulo para las clases Objective-C, que corresponde al tipo Class
. Como la mayoría del código no necesita variables para las clases de referencia, su uso no es común. Un ejemplo es:
Class someClass = Nil;
Class anotherClass = [NSString class];
NULL
es el valor literal nulo para punteros C arbitrarios. Por ejemplo,
int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;
NSNull
es una clase para objetos que representan nulo. De hecho, solo hay un objeto, es decir, el que devuelve +[NSNull null]
. Es diferente de nil
porque nil
es un valor literal nulo, es decir, no es un objeto. La instancia única de NSNull
, por otro lado, es un objeto adecuado.
NSNull
se usa a menudo en las colecciones de Foundation, ya que no pueden almacenar valores nil
. En el caso de los diccionarios, -objectForKey:
devuelve nil
para indicar que una clave determinada no tiene un objeto correspondiente en el diccionario, es decir, la clave no se ha agregado al diccionario. Si desea que sea explícito que tiene una determinada clave pero aún no tiene un valor, puede usar [NSNull null]
.
Por ejemplo, lo siguiente arroja una excepción porque los diccionarios no pueden almacenar valores nil
:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
Por otro lado, el siguiente código es válido ya que [NSNull null]
es un objeto no nil
:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
Vale la pena mencionar que las colecciones de Foundation tienen inicializadores que usan nil
como un marcador para el final de una lista de objetos sin tener que especificar el número de elementos en la lista. Esto solo puede suceder porque no se puede almacenar nil
en una colección Foundation. Por ejemplo,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
En cuanto a NIL
o NSNil
, no existen tales cosas en Objective-C o Apple Foundation.
Nil, Null y nil se usan con abajo
1> Nil para Objective c Class
2> nil para Objective c object
3> nulo para el puntero C
Ejemplo:
1> Clase A = Nada;
2> NSString strName = nil;
3> char * pointerChar = NULL;