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]?
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
.
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.
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.
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]
.
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.
Attention, if([NSNull null])
renvoie true
.
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.
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
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.
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.
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.
Fondamentalement: nil: pointeur null sur un objet et null: correspond à un autre type
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.
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.
Cela vous aidera à comprendre la différence entre nil, NIL et null.
Le lien ci-dessous peut vous aider d'une certaine manière:
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.