2009-03-30 24 views
0

Objective-Cコードでは、2つのNSString値の比較を試みていますが、実行時エラーが発生します。コードは次のとおりです。Objective-CでNSStringが動作しない

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"); 
} 

NSStringのauthFlagは実際には有効な文字列値を持つとテストされています。 authFlagは "1"または "0"の値を持ちます(json-frameworkを使用してJSON呼び出しへの応答から得られます)。

ここでランタイムエラーです:エラーログが示すように

[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' 

答えて

14

は、authFlagはNSStringが、NSCFBooleanではありません。

あなたはこれを行うことができます。

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

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

これは私がエラーに基づいて考えていたものですが、NSStringとして入力されたときにauthFlagはどのようにブール値になりますか?私が比較を行う時までにvarを宣言してインスタンス化する時から暗黙的な変換/キャストが行われていますか? – mibrop

+2

[innerContent valueForKey:@ "authenticationFlag"]は、NSCFBooleanへのポインタを返します。ポインタ値をNSString *に格納するだけです。これは、指し示すオブジェクトを文字列にしません。 –

+2

NSStringをNSArrayまたはUITableViewに置き換えるだけで簡単に置き換えることができます。結果は変わらない。指示されているオブジェクトは、依然としてNSCFBooleanです。 –

3

あなたauthFlagがするNSNumberとそのNSStringのではありません。

NSCFBooleanは、NSNumberのプライベートサブクラスです。それはクラスクラスタ設計パターンの下に来る。

isEqualToStringという名前のメソッドはありません.NSNumberで使用できます。
変更されたコードは次のとおりです。

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

if([authFlag boolValue]) { 
    NSLog(@"Logged in"); 
    self.view = homeView; 
} else { 
    NSLog(@"Not logged in"); 
} 
関連する問題