whatwg tutorial svytable svydesign surveys spec guide complex objective-c null nsnull

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:

http://nshipster.com/nil/

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;