2009-03-30 9 views
0

Ci-dessous est le code Objective-C où j'essaie de faire une comparaison entre deux valeurs NSString, mais il génère une erreur d'exécution. Voici le code:NSString Comparer ne fonctionne pas dans Objective-C

NSDictionary *innerContent=[JSONResponseDict valueForKey:@"JSONRESPONSE"]; 
NSString *authFlag = [innerContent valueForKey:@"authenticationFlag"]; 

NSLog(@"authFlag = %@",authFlag); 

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle:nil 
         message: [NSString stringWithFormat:@"authenticationFlag = %@",authFlag] 
         delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
[alert show]; 
[alert release]; 

// This block is problematic 
if ([authFlag isEqualToString:@"1"]){ 
    NSLog(@"Logged in"); 
    self.view = homeView; 
} else { 
    NSLog(@"Not logged in"); 
} 

Notez que le NSString authFlag a été testé comme ayant en effet une valeur de chaîne valide. authFlag a une valeur de "1" ou "0" (elle provient d'une réponse à un appel JSON utilisant json-framework).

est ici l'erreur d'exécution:

[Session started at 2009-03-29 19:21:00 -0700.] 
2009-03-29 19:21:11.186 taggle[4144:20b] [email protected]&password=opensesame 
2009-03-29 19:21:11.653 taggle[4144:20b] authFlag = 1 
2009-03-29 19:21:11.655 taggle[4144:20b] *** -[NSCFBoolean isEqualToString:]:  unrecognized selector sent to instance 0xa089c400 
2009-03-29 19:21:11.661 taggle[4144:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFBoolean isEqualToString:]: unrecognized selector sent to instance 0xa089c400' 

Répondre

14

Comme l'erreur journal affiche, authFlag est pas un NSString, mais un NSCFBoolean.

Vous pouvez le faire:

NSCFBoolean *authFlag = [innerContent valueForKey:@"authenticationFlag"]; 

if([authFlag boolValue]) { 
    NSLog(@"Logged in"); 
    self.view = homeView; 
} else { 
    NSLog(@"Not logged in"); 
} 
+1

C'est exactement ce que je pensais basé sur l'erreur, mais comment authFlag peut-il être booléen quand il est tapé comme un NSString? Existe-t-il une conversion/conversion implicite à partir du moment où je déclare et instancie le var au moment où je fais la comparaison? – mibrop

+2

[innerContent valueForKey: @ "authenticationFlag"] renvoie un pointeur sur un NSCFBoolean. Vous stockez simplement la valeur du pointeur dans un NSString *. Cela ne fait pas de l'objet pointé une chaîne. –

+2

Vous pouvez tout aussi bien remplacer NSString avec NSArray ou même UITableView. Le résultat ne change pas. L'objet pointé sur est toujours un NSCFBoolean. –

3

Votre authFlag est NSNumber et son non NSString.

NSCFBoolean est une sous-classe privée de NSNumber. Il s'agit d'un modèle de conception de cluster de classe.

Il n'existe aucune méthode portant le nom isEqualToString: disponible dans NSNumber.
Voici le code modifié.

NSNumber *authFlag = [innerContent valueForKey:@"authenticationFlag"]; 

if([authFlag boolValue]) { 
    NSLog(@"Logged in"); 
    self.view = homeView; 
} else { 
    NSLog(@"Not logged in"); 
}