Je veux connaître la différence entre nil
, NIL
et null
. J'ai cherché sur Google et j'ai trouvé ceci:
nil
-> pointeur nul vers un objet Objective-C
NIL
-> pointeur nul vers la classe Objective-C
null
-> pointeur nul vers le type primitif ou absence de données
Mais je ne peux pas comprendre clairement les termes "objet Objective-C" et "classe".
Veuillez m'expliquer cela. De plus, existe-t-il un mot comme NSNull
ou NSNil
dans Objective-C? Si tel est le cas, veuillez expliquer à quoi il sert.
nil
est la valeur nulle littérale des 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 nulle littérale pour les classes Objective-C, correspondant au type Class
. Étant donné que la plupart du code n'a pas besoin de variables pour référencer les classes, son utilisation n'est pas courante. Un exemple est:
Class someClass = Nil;
Class anotherClass = [NSString class];
NULL
est la valeur nulle littérale 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 retourné par +[NSNull null]
. Il est différent de nil
car nil
est une valeur nulle littérale, c'est-à-dire qu'il ne s'agit pas d'un objet. En revanche, l'instance unique de NSNull
est un objet approprié.
NSNull
est souvent utilisé dans les collections Foundation car elles ne peuvent pas stocker les valeurs nil
. 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 avez une certaine clé mais qu’elle n’a pas encore de valeur, vous pouvez utiliser [NSNull null]
.
Par exemple, ce qui suit lève une exception car les dictionnaires ne peuvent pas stocker les valeurs nil
:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
En revanche, le code suivant est valide puisque [NSNull null]
est un objet nonnil
:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
Il convient de mentionner que les collections Foundation ont des initialiseurs qui utilisent nil
comme marqueur pour la fin d'une liste d'objets sans avoir à spécifier le nombre d'éléments dans la liste. Cela ne peut se produire que parce que nil
ne peut pas être stocké dans une collection Foundation. Par exemple,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
Quant à NIL
ou NSNil
, il n'y a rien de tel dans Objective-C ou Apple Foundation.
Je ne suis pas sûr mais je pense que nil
ne devrait être utilisé qu'à la place d'un id
, ce que Java et les programmeurs C++ considéreraient comme un pointer
en object
. Utilisez NULL
pour les pointeurs non-objet.
nil
est généralement utilisé pour un type d'objet Objective-C, tandis que NULL
est utilisé pour les pointeurs de style c
Nil, Null et nil sont utilisés avec ci-dessous
1> Néant pour la classe Objective C
2> néant pour l'objet Objective C
3> Null pour le pointeur C
Exemple:
1> Classe A = néant;
2> NSString strName = nil;
3> char * pointerChar = NULL;
Supposons que vous ayez une classe MyClass
puis par convention nil
est utilisé si vous voulez initialiser son instance à une valeur nulle (identique à null
en Java) c'est-à-dire.
MyClass *obj = nil;
et si vous souhaitez initialiser un pointeur primitif sur une valeur nulle (identique à c) vous utilisez
int *ptr = NULL;
et si vous voulez initialiser à Class
référence à une valeur nulle (identique à null
en Java) alors utilisez
Class classRefOfMyClass = Nil;
C'est juste une convention sinon Nil ou nil ont la même signification et peut-être NULL, nil ou Nil sont tous identiques.
Voici la définition de ceux-ci dans objc.h
fichier
#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
Et en stddef.h
#define NULL ((void*)0)
Et la définition de __DARWIN_NULL
dans _types.h
#define __DARWIN_NULL ((void *)0)
Il n'y a donc pas de différence logiquement. L'idée principale ici est d'initialiser un pointeur que ce soit C
ou Objective-C
à 0
. Si vous connaissez C
, vous pouvez attribuer
int *ptr = 0;
sans coulée de type 0
vers un pointeur. Comme vous n'avez pas besoin de transtyper 0
pour l'affecter à un pointeur.
0
et rien d'autre.Cela vous aidera à comprendre la différence entre nil, NIL et null.
Ces trois valeurs représentent des valeurs nulles ou pointeur zéro. La différence est que tandis que [~ # ~] null [~ # ~] représente zéro pour tout pointeur, nil est spécifique aux objets ( par exemple, id) et Nil est spécifique aux pointeurs de classe . Il devrait être considéré comme une meilleure pratique pour utiliser le bon objet nul dans les bonnes circonstances à des fins de documentation, même si rien n'empêche quelqu'un de mélanger et de faire correspondre au fur et à mesure.
Le lien ci-dessous peut vous aider d'une manière ou d'une autre:
Voici une partie importante du lien:
nil, NIL et null. dépend de votre condition.
NSNull
les collections comme NSArray
et NSDictionary
ne pouvant pas contenir de valeurs nulles.
NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary];
MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey"
NSLog(@"Keys: %@", [mutableDictionary allKeys]);
néant
tous les pointeurs de cet objet vers d'autres objets commencent par nil, il n'est donc pas nécessaire, par exemple, de définir self. (association) = nil dans les méthodes init.
Dans d'autres langages, comme C++, cela planterait votre programme, mais en Objective-C, l'invocation d'une méthode sur nil renvoie une valeur nulle.
if (name != nil)
{
........
}
nil (id) 0 valeur nulle littérale pour les objets Objective-C
Nil (Classe) 0 valeur nulle littérale pour les classes Objective-C