78 votes

Différence entre nil, NIL et, null en Objective-C

Je veux savoir la différence entre nil , NIL et null . J'ai cherché sur Internet et j'ai trouvé ceci :

nil -> pointeur nul vers un objet Objective-C

NIL -> pointeur nul vers une classe Objective-C

null -> pointeur nul vers un type primitif ou absence de données

Mais je ne suis pas en mesure de comprendre clairement les termes "objet Objective-C" et "classe".

Veuillez me l'expliquer. De plus, existe-t-il un mot comme NSNull ou NSNil en Objective-C ? Si oui, veuillez expliquer à quoi il sert.

158voto

Bavarious Points 43993

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.

7voto

7KV7 Points 19750

Je ne suis pas sûr mais je pense nil ne doit être utilisé qu'à la place d'un id ce que les programmeurs Java et C++ considèrent comme un pointer à un object . Utilisez NULL pour les pointeurs non-objets.

nil est généralement utilisé pour un type d'objet Objective-C, tandis que NULL est utilisé pour les pointeurs de style c

7voto

Chris Alan Points 880

Nil,Null et nil sont utilisés avec ci-dessous

1> Néant pour la classe d'objectif c

2> nil pour l'objet Objective c

3> Null pour le pointeur C

Exemple :

1>Classe A=Nulle ;

2>NSString strName=nil ;

3>char *pointerChar = NULL ;

5voto

Inder Kumar Rathore Points 13538

Supposons que vous ayez une classe MyClass alors par convention nil est utilisé si vous voulez initialiser son instance à une valeur nulle (comme dans le cas de null en java) c'est-à-dire

MyClass *obj = nil;

et si vous voulez initialiser un pointeur primitif à une valeur nulle (comme en c) vous utilisez

int *ptr = NULL; 

et si vous voulez initialiser à Class référence à une valeur nulle (identique à null en java), puis utilisez

Class classRefOfMyClass = Nil;

C'est juste une convention, sinon Nil ou nil ont la même signification et peut-être que NULL , nil ou Nil sont identiques.

Voici la définition de ces derniers 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 dans stddef.h

#define NULL ((void*)0)

Et la définition de __DARWIN_NULL sur _types.h

#define __DARWIN_NULL ((void *)0)

Il n'y a donc aucune différence sur le plan logique. L'idée principale ici est d'initialiser un pointeur si C ou Objective-C à 0 . Si vous avez des connaissances en matière de C vous pouvez alors attribuer

int *ptr = 0;

sans moulage de type 0 à un pointeur. Comme vous n'avez pas besoin de faire un typage 0 pour l'affecter à un pointeur.

En bref, ils sont tous 0 et rien d'autre.

4voto

Mihir Oza Points 25

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 entre différence est que, tandis que NULL représente zéro pour tout pointeur, néant est spécifique à objets (par exemple, id) et Néant est spécifique à les pointeurs de classe. Il faut considérer comme une sorte de bonne pratique d'utiliser le bon objet null dans la bonne circonstance à des fins de documentation, même si même si rien n'empêche quelqu'un de mélanger et d'assortir comme bon lui semble les objets nuls. au fur et à mesure.

Le lien ci-dessous peut vous aider d'une certaine manière :

http://nshipster.com/nil/

Voici une partie importante du lien :

enter image description here

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