web-dev-qa-db-fra.com

Quand devrais-je utiliser nil et NULL dans Objective-C?

Ceci est un exemple de code:

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

Quand devrais-je utiliser nil, NULL et [NSNull null]?

163
Biranchi

Vous pouvez utiliser nil partout où vous pouvez utiliser null. La principale différence est que vous pouvez envoyer des messages à nil afin que vous puissiez l’utiliser dans certains endroits où null ne fonctionne pas.

En général, utilisez simplement nil.

106
Alex

Ils diffèrent par leurs types. Ils sont tous nuls, mais NULL est un void *, nil est un id et Nil est un pointeur de classe.

302
NSResponder

nil est une valeur vide liée/correspondant à un objet (le type id dans Objective-C). nil n'a pas de référence/adresse, juste une valeur vide.

NSString *str = nil;

Donc, néant devrait être utilisé, si nous avons affaire à un objet.

if(str==nil)
    NSLog("str is empty");

Maintenant NULL est utilisé pour pointeur non-objet (comme un pointeur C) en Objective-C. Comme nil, NULL n'a ni valeur ni adresse.

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

Donc, s'il y a une situation, quand j'ai besoin de vérifier mon struct (variable de type de structure) est vide ou pas, j'utiliserai:

if (dStruct == NULL)
    NSLog("The struct is empty");

Prenons un autre exemple, le

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

De observation de la valeur clé, le contexte devrait être un pointeur C ou une référence d'objet. Ici, pour le contexte, nous ne pouvons pas utiliser nil; nous devons utiliser NULL .

Enfin, la classe NSNull définit un objet singleton utilisé pour représenter les valeurs NULL dans les objets de collection (NSArray, NSDictionary). Le [NSNull null] renverra l'instance singleton de NSNull. En gros, [NSNull null] est un objet approprié.

Il n'y a aucun moyen d'insérer un objet nil dans un objet de type collection. Prenons un exemple:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

Sur la deuxième ligne, nous n'obtiendrons aucune erreur, car il est parfaitement juste d'insérer un objet NSNull dans un objet de type collection. Sur la troisième ligne, nous obtiendrons l'erreur "l'objet ne peut pas être nul". Parce que nil n'est pas un objet.

26
Shad

NULL et nil sont égaux, mais nil est une valeur d'objet alors que NULL est une valeur de pointeur générique ((void*)0, Pour être précis). [NSNull null] est un objet destiné à remplacer nil dans des situations où nil n'est pas autorisé. Par exemple, vous ne pouvez pas avoir une valeur nulle dans un NSArray. Donc si vous avez besoin de représenter un "néant", vous pouvez utiliser [NSNull null].

18
Chuck

J'ai trouvé ce qui suit:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

En apparence, il n'y a pas de différence mais une différence conceptuelle.

10
Colnaghi

Attention, if([NSNull null]) renvoie true.

7
Nicolas Manzini

Pour développer un commentaire de @cobbal:

MacTypes.h contient:

#ifndef nil
   #define nil NULL
#endif
5
Justin Tanner

Ils sont tous deux juste typecast zéro. Fonctionnellement, il n'y a pas de différence entre eux. c'est à dire.,

#define NULL ((void*)0)
#define nil ((id)0)

Il y a une différence, mais seulement pour vous et les autres humains qui lisent le code, le compilateur s'en fiche.

Une dernière chose que nil est une valeur d'objet alors que NULL est une valeur de pointeur générique.

5
Nirav

Dans les SDK OS X et iOS modernes:

  • nil et Nil et NULL sont identiques dans Objective-C et dans Objective-C++ avant C++ 11.
  • nil et Nil et std::nullptr sont identiques dans Objective-C++ avec C++ 11.

Stylistiquement, de nombreuses personnes préfèrent utiliser nil pour les objets Objective-C et NULL ou nullptr pour les autres types de pointeur. J'utilise moi-même maintenant nil partout.

[NSNull null] est un objet singleton utilisé pour représenter les valeurs null dans les situations où nil est interdit en tant que valeur (généralement dans un objet de collection tel que NSArray ou NSDictionary). Nombre et valeur de la programmation: Utiliser NSNull

4
Greg Parker

Comme déjà mentionné, ils sont identiques, mais j'utilise l'un ou l'autre en fonction de la langue dans laquelle le cadre correspondant a été écrit.

Pour tout ce qui concerne Objective-C, j'utilise nil. Par exemple:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

Cependant, lors de la vérification de la validité des modèles de données à partir d'un framework C (tel que le framework AddressBook et CoreFoundation), j'utilise NULL. Par exemple:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

De cette façon, j'ai des indices subtils dans mon code si je traite avec du code basé sur Obj-C ou C.

3
Tafkadasoh

Il y a une différence dans certains contextes.

Littéralement, Null est un caractère: ASCII 0.

Nil est équivalent à blank, aucune valeur.

Selon le contexte de programmation, cela peut être une grande différence.

2
Meatloaf

nil est un pointeur d'objet vers rien. Bien que sémantiquement distincts de [~ # ~] null [~ # ~] , ils sont techniquement équivalents les uns aux autres.

Au niveau de la structure, Foundation définit NSNull , qui définit une méthode de classe, + null, qui renvoie l'objet singleton NSNull. NSNull est différent de nil ou [~ # ~] null [~ # ~] , en ce sens qu’il s’agit d’un réel objet , plutôt qu'une valeur nulle.

De plus, dans Foundation/NSObjCRuntime.h, , Nil est défini comme une classe pointeur sur rien.

Référez-vous pour plus d'informations - nil/Nil/NULL/NSNull

1
Shubham Jain

Fondamentalement: nil: pointeur null sur un objet et null: correspond à un autre type

0
gerachev

Utilisez NULL par exemple lorsque vous appelez une méthode Objective-C avec un paramètre de sortie de type (NSError **).

Je vois beaucoup d'exemples de code sur le Web où les utilisateurs fournissent nil au lieu de NULL dans ce cas. En effet, il s'agit d'un pointeur sur un pointeur et donc pas directement sur un type d'objet Objective-C. Comme indiqué ci-dessus, nil devrait être utilisé pour les types d'objet Objective-C.

0
bio

nil signifie absence de valeur tandis que NULL représente No Object,

NSArray * array = @ [@ "Hello World!", @ 101, [NSNULL null]];

Ici [NSNULL null] est un objet qui signifie aucun objet, vous ne pouvez pas ajouter nil en même temps pour indiquer l'absence d'objet.

vous pouvez aussi utiliser nil et [NSNUll null] pour la vérification.

0
Roshanboy4u

Cela vous aidera à comprendre la différence entre nil, NIL et null.

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

http://nshipster.com/nil/

nil -> valeur null littérale pour les objets Objective-C.

Nil -> valeur null littérale pour les classes Objective-C.

NULL -> valeur NULL littérale pour les pointeurs C.

NSNULL -> objet singleton utilisé pour représenter null.

0
Subhakar Prabhu