NSString比较在Objective-C中不起作用

mib*_*rop 1 iphone cocoa cocoa-touch objective-c

以下是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");
}
Run Code Online (Sandbox Code Playgroud)

请注意,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] userEmail=user@domain.com&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'
Run Code Online (Sandbox Code Playgroud)

Can*_*der 14

正如错误日志所示,authFlag不是一个NSString,而是一个NSCFBoolean.

你可以这样做:

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

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

  • [innerContent valueForKey:@"authenticationFlag"]返回指向NSCFBoolean的指针.您只是将指针值存储在NSString*中.这不会使尖头对象成为字符串. (2认同)
  • 您可以使用NSArray甚至UITableView轻松替换NSString.结果不会改变.指向的对象仍然是NSCFBoolean. (2认同)
  • Objective-C对象的声明类型纯粹是因为编译器可以警告您两个声明的类型之间的不匹配.它与实际对象没有区别.请记住,这些都是指针 - 实际对象不存储在那里,只是指向其地址的指针. (2认同)