50 votes

Quelle est la différence entre [NSNull null] et nil?

Voici un contexte où j'ai vu cela:

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

pourquoi ne pas rien à cet endroit?

86voto

Mike Caron Points 2426

Directement à partir de Apple: "La NSNull classe définit un objet singleton vous utiliser pour représenter les valeurs null dans les situations où le nil est interdit en tant que valeur (généralement dans un objet de collection comme un tableau ou un dictionnaire)."

Donc dans votre exemple, c'est exactement ce qui se passe, le programmeur est de choisir de placer un objet null dans les contrôleurs de tableau, où nul n'est pas autorisé en tant que valeur.

14voto

htw Points 10312

Vous ne pouvez pas ajouter une valeur nil à un NSArray ou NSMutableArray . Si vous devez stocker une valeur nil , vous devez utiliser la classe wrapper NSNull , comme indiqué dans l'extrait que vous avez. Ceci est spécifié dans la documentation .

10voto

Hampden123 Points 146

Nous sommes tous d'accord que [NSNull null] est utile comme un espace réservé où un objet est requis, comme indiqué ci-dessus. Mais sauf si c'est explicitement utilisé dans la cession de votre objet, il ne doit pas être utilisé à titre de comparaison, une erreur que j'ai fait dans le passé.

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]");

Sortie:

2014-01-31 10:57:11.179 MCDocsApp[13266:a0b] Cas 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] Cas 2

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

9voto

Rose Perrone Points 14478

La collecte des classes comme l' NSArray et NSDictionary ne peut pas contenir de nil valeurs. NSNULL a été créé spécifiquement pour l'espace réservé nil. Il peut être mis en classes de collection, et seulement prend de la place.

NSNull définit un objet singleton, ce qui signifie qu'il n'y a jamais qu'une seule instance de NSNull (que vous créez à l'aide d' [NSNull null]), mais il peut être utilisé dans autant d'endroits que vous souhaitez.

-14voto

bonjing Points 1

nil marque la fin d'un tableau après un tableau d'objets ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X