web-dev-qa-db-fra.com

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

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.

70
shweta

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.

150
user557219

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

7
visakh7

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;

7
Chris Alan

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.

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

5

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:

http://nshipster.com/nil/

Voici une partie importante du lien:

enter image description here

2
Mihir Oza

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)
{
........
}

Signification de la valeur du symbole

nil (id) 0 valeur nulle littérale pour les objets Objective-C

Nil (Classe) 0 valeur nulle littérale pour les classes Objective-C

1
Bhumesh Purohit