objective-c cocoa-touch cocoa null nsnull

objective c - ¿Cuál es la diferencia entre[NSNull null] y nil?



objective-c cocoa-touch (6)

Aquí hay un contexto donde lo he visto:

NSMutableArray *controllers = [[NSMutableArray alloc] init]; for (unsigned i = 0; i < kNumberOfPages; i++) { [controllers addObject:[NSNull null]]; }

¿por qué no nada en ese lugar?


Directamente desde Apple :

La clase NSNull define un objeto singleton que se usa para representar valores nulos en situaciones donde nil está prohibido como un valor (generalmente en un objeto de colección como una matriz o un diccionario).

Entonces, en su ejemplo, eso es exactamente lo que está sucediendo, el programador elige colocar un objeto nulo en la matriz de controladores, donde nil no está permitido como valor.


Las clases de colección como NSArray y NSDictionary no pueden contener valores nil . NSNULL se creó específicamente como un marcador de posición para nil . Se puede poner en clases de colección y solo ocupa espacio.

NSNull define un objeto singleton, lo que significa que solo hay una sola instancia de NSNull (que crea utilizando [NSNull null] ), pero se puede usar en todos los lugares que desee.


No puede agregar un valor nil a un NSArray o NSMutableArray . Si necesita almacenar un valor nil , debe usar la clase NSNull contenedora, como se muestra en ese fragmento que tiene. Esto está especificado en la documentation .


Todos estamos de acuerdo en que [NSNull null] es útil como marcador de posición donde se requiere un objeto, como se explicó anteriormente. Pero a menos que se use explícitamente en la asignación de su objeto, no debe usarse en comparación, un error que cometí en el pasado.

id a; NSLog(@"Case 1"); if (a == nil) NSLog(@"a == nil"); if (a == Nil) NSLog(@"a == Nil"); if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]"); NSLog(@"Case 2"); a = [NSNull null]; if (a == nil) NSLog(@"a == nil"); if (a == Nil) NSLog(@"a == Nil"); if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

Salida:

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] Caso 1

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] a == nil

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] a == Nil

2014-01-31 10: 57: 11.180 MCDocsApp [13266: a0b] Caso 2

2014-01-31 10: 57: 11.180 MCDocsApp [13266: a0b] a isEqual: [NSNull null]


nil marca el final de una matriz después de una serie de objetos ...


La clase NSNull define un objeto singleton que se usa para representar valores nulos en situaciones donde nil está prohibido como un valor (generalmente en un objeto de colección como una matriz o un diccionario).

No puede agregar un valor nulo a un NSArray o NSMutableArray. Si necesita almacenar un valor nulo, debe usar la clase de contenedor NSNull.

Las clases de colección como NSArray y NSDictionary no pueden contener valores nulos. NSNULL se creó específicamente como un marcador de posición para nil. Se puede poner en clases de colección y solo ocupa espacio.

Ver el enlace para referencia

Apple