54 votes

Comment détecter si NSString est null?

J'ai un morceau de code qui détecte si un NSString est NULL , nil , etc. Cependant, il se bloque. Voici mon code:

 NSArray *resultstwo = [database executeQuery:@"SELECT * FROM processes WHERE ready='yes' LIMIT 0,1"];
for (NSDictionary *rowtwo in resultstwo) {

NSString *getCaption = [rowtwo valueForKey:@"caption"];

if (getCaption == NULL) {
theCaption = @"Photo uploaded...";
} else if (getCaption == nil) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@""]) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@" "]) {
theCaption = @"Photo uploaded...";
}

}
 

Et voici l'erreur:

Arrêt de l'application en raison d'une exception non capturée ' NSInvalidArgumentException ', raison: ' -[NSNull isEqualToString:] : sélecteur non reconnu envoyé à l'instance 0x3eba63d4 '

Est-ce que je fais quelque chose de mal? Dois-je le faire différemment?

168voto

Regexident Points 17722

L' NULL de la valeur pour Objective-C des objets (type id) est nil.

Alors qu' NULL est utilisé pour C les pointeurs (type void *).

(À la fin, les deux finissent par la même valeur (0x0). Ils diffèrent dans le type de cependant.)

En Objective-C:

  • nil (tout en minuscule) est une valeur null pointeur vers un Objectif-C objet.
  • Nil (en majuscule) est un pointeur null pour un Objectif-C de classe.
  • NULL (en majuscule) est un pointeur null pour rien d'autre (C les pointeurs, qui est).
  • [NSNull null] est un singleton pour les situations où l'utilisation de néant n'est pas possible (ajout/réception néant vers/à partir de NSArrays par exemple)

En Objective-C++:

  • Tous les ci-dessus, plus:
  • null (en minuscules) ou nullptr (C++11 ou version ultérieure) est un pointeur null pour les objets C++ .

Afin de vérifier l'encontre nil vous devez comparer nil (ou NULL respectivement) explicitement:

if (getCaption == nil) ...

ou laissez - ObjC / C le faire implicitement pour vous:

if (!getCaption) ...

Cela fonctionne comme chaque expression en C (et avec Objective-C d'être un sur-ensemble de celui-ci) a un accord implicite de valeur booléenne:

expression != 0x0 => true
expression == 0x0 => false

Maintenant, lors de la vérification des NSNull de toute évidence, cela ne marcherait pas aussi [NSNull null] renvoie un pointeur sur une instance du singleton de NSNull, et pas nil, et par conséquent, il n'est pas égal à 0x0.

Afin de vérifier l'encontre NSNull on peut soit utiliser:

if ((NSNull *)getCaption == [NSNull null]) ...

ou (de préférence, voir les commentaires):

if ([getCaption isKindOfClass:[NSNull class]]) ...

Gardez à l'esprit que le dernier (de par l'utilisation d'un message d'appel) sera de retour false si getCaption arrive à être nil, qui, bien que formellement correct, peut-être pas ce que vous attendez/le souhaitez.

Donc si l'un (pour quelque raison que ce soit) nécessaires pour vérifier à la fois nil/NULL et NSNull, il faudrait combiner ces deux vérifications:

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...

Pour obtenir de l'aide sur la création de l'équivalent positif contrôles de voir De Morgan, de la législation et de la négation booléenne.

Edit: NSHipster.com tout juste de publier un excellent article sur les différences subtiles entre nil, null, etc.

24voto

ludesign Points 929

Tu devrais utiliser

if ([myNSString isEqual:[NSNull null]])

Ceci vérifiera si l'objet myNSString est égal à l'objet NSNull.

2voto

Dustin Points 398
 if([getCaption class] == [NSNull class])
    ...
 

Vous pouvez aussi faire

 if([getCaption isKindOfClass:[NSNull class]])
    ...
 

si vous voulez être à l’avenir contre de nouvelles sous-classes de NSNull.

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