167 votes

Lors de l'utilisation de nul et de NUL en 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 utiliser nul, NUL et [NSNULL null] ?

Merci

308voto

NSResponder Points 14459

Ils diffèrent dans leurs types. Ils sont tous à zéro, mais NULL est void *, nil est id, et Nil est un pointeur de Classe.

110voto

Alex Points 2182

Vous pouvez utiliser néant où vous pouvez utiliser la valeur null. La principale différence est que vous pouvez envoyer des messages à zéro, de sorte que vous pouvez l'utiliser dans des endroits où nul cant travail.

En général, il suffit d'utiliser néant.

29voto

Shad Points 765

néant est une valeur vide lié/correspondent à un objet(de type id de l'objectif c). néant ai pas de référence/adresse, juste une valeur vide.

NSString *str = nil;

donc, nul ne doit être utilisé, si nous avons affaire à un objet.

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

Maintenant NULL est utilisé pour le non-pointeur d'objet(comme c pointeur) en Objective-c. Comme néant , NULL ai pas de valeur, pas d'adresse.

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

Donc, si il ya une situation, quand j'ai besoin de vérifier mon struct (structure type de la variable est vide ou non alors, je vais l'utiliser,

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

Permet d'avoir un autre exemple, l'

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

de clé-valeur en observant le contexte devrait être un C pointeur ou une référence d'objet. Voici pour le contexte, nous ne pouvons pas utiliser néant, nous devons utiliser la valeur NULL.

Enfin, le NSNull classe définit un objet singleton utilisé pour représenter les valeurs null dans les objets de collection(NSArray,NSDictionary). L' [NSNull null] retourne l'instance du singleton de NSNull. Fondamentalement, [NSNull null] est un objet approprié.

Il n'y a aucun moyen d'insérer un nul objet dans une collection de type objet.Permet d'avoir un exemple

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

Sur la deuxième ligne, on ne sera pas faire d'erreur, parce qu'il est parfaitement juste à insérer NSNull objet dans une collection de type objet. Sur la troisième ligne, nous aurons "objet ne peut pas être nul" erreur. Parce que nul n'est pas un objet.

19voto

Chuck Points 138930

NULLE et de nul sont égaux les uns aux autres, mais nul est un objet de valeur, tandis que la valeur NULL est un pointeur générique de la valeur ((void*)0, pour être précis). [NSNull null] est un objet qui est censé représenter néant dans des situations où le néant 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].

12voto

Colnaghi Points 158

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 */

La façon dont elle regarde, il n'y a pas de différence, mais d'ordre conceptuel.

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