nil
est la valeur littérale nulle pour les objets Objective-C, correspondant au type abstrait id
ou tout type Objective-C déclaré via @interface
. Par exemple :
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // do something
Nil
est la valeur littérale nulle pour les classes Objective-C, correspondant au type Class
. Comme la plupart du code n'a pas besoin de variables pour référencer les classes, son utilisation n'est pas courante. En voici un exemple :
Class someClass = Nil;
Class anotherClass = [NSString class];
NULL
est la valeur littérale nulle pour les pointeurs C arbitraires. Par exemple,
int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;
NSNull
est une classe pour les objets qui représentent null. En fait, il n'y a qu'un seul objet, à savoir celui renvoyé par +[NSNull null]
. Il est différent de nil
parce que nil
est une valeur littérale nulle, c'est-à-dire qu'il ne s'agit pas d'un objet. L'instance unique de NSNull
par contre, est un objet propre.
NSNull
est souvent utilisée dans les collections de la Fondation, car elle ne peut pas stocker les données de l'entreprise. nil
valeurs. Dans le cas des dictionnaires, -objectForKey:
renvoie à nil
pour indiquer qu'une clé donnée n'a pas d'objet correspondant dans le dictionnaire, c'est-à-dire que la clé n'a pas été ajoutée au dictionnaire. Si vous souhaitez indiquer explicitement que vous disposez d'une certaine clé mais qu'elle n'a pas encore de valeur, vous pouvez utiliser la commande [NSNull null]
.
Par exemple, la phrase suivante lève une exception parce que les dictionnaires ne peuvent pas stocker les données suivantes nil
valeurs :
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
Par contre, le code suivant est valide puisque [NSNull null]
est un non nil
objet :
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
Il est utile de mentionner que les collections de Foundation ont des initialisateurs qui utilisent nil
comme marqueur de la fin d'une liste d'objets sans avoir à préciser le nombre d'éléments de la liste. Cela ne peut se faire que parce que nil
ne peuvent pas être stockés dans une collection Foundation. Par exemple,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
Quant à NIL
ou NSNil
il n'existe pas de telles choses en Objective-C ou en Apple Foundation.