2012-07-26 34 views
0

我做这样的事情:iOS版 - 异常检查时,如果字符串为空

// GET THE USER ID 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
NSString *user_id = [standardUserDefaults objectForKey:@"user_id"]; 

然后检查USER_ID是否为空

if ([user_id length] == 0) { 
    proceed = false; 
    NSLog(@"Error: User id is not set."); 
} 

我得到这个运行时异常:

*由于未捕获异常'NSInvalidArgumentException'而终止应用程序,原因: ' - [__ NSCFBoolean length]:无法识别的选择器发送到实例0x1469f70'

任何想法,为什么我得到异常?我不认为我所做的事情有什么不妥。

谢谢!

回答

5

这:

NSString *user_id = [standardUserDefaults objectForKey:@"user_id"]; 

将返回一个NSNumber(如NSCFBooleanNSNumber私有子类),而不是一个字符串。因此它不执行length,导致异常。

也许你想测试[user_id intValue] > 0?即使你把它转换成一个字符串,它也会有一定的长度。

(枝节问题提出:仅仅声明user_id作为参考的NSString并不意味着任何你分配给它奇迹般地成为一个字符串;的确存在类型对象的类型强制任何影响编译器不因为NSUserDefaults会返回id类型的对象,即它保证它们是对象,但不会声明它们的类型,编译器也不知道。所有对象都可以在id之间产生或不产生警告。它可以被诸如用户默认值,NSArray等的类使用,只要它是一个对象,它们就可以接受任何东西)。

编辑:基于在评论中提出的问题,这听起来像最初被存储可能不是一个字符串的东西。验证网络资料的一个好方法可能是这样的:

// fall through here if the object isn't a string 
if(![responseString isKindOfClass:[NSString class]]) 
{ 
    // check whether it's something that can be converted to a string 
    if(![responseString respondsToSelector:@selector(stringValue)]) 
    { 
     // some sort of error condition; the server returned something 
     // that isn't a string and doesn't convert (in and of itself) to string 
    } 
    else 
    { 
     // convert the object to a string 
     responseString = [responseString stringValue]; 
    } 
} 
+1

实际上我想获得实际的user_id值,这是我放在那里的字符串值。从standardUserDefaults获取该字符串的正确方法是什么?谢谢! – GeekedOut 2012-07-26 17:09:47

+0

我们怎么能这么肯定'user_id'是NSString的类型的呢?它可能是一个字母数字或数字字符串。 – samfisher 2012-07-26 17:10:25

+1

@GeekedOut如果用户默认的存储号码,您必须存储的号码。它不会更改类型。只是为了确认:'user_id'是真正的局部变量 - 这不只是你张贴的问题是,它使一个快速编辑?尝试添加'NSLog(@“%@”,[user_id class])或'if([user_id isKindOfClass:[NSNumber class]])NSLog(@“是number”)'来说服自己。 @samfisher引发的异常表明'length'被发送到的对象的类型是'NSCFBoolean',并且这是'NSNumber'的一个私有子类(后者在实践中是一个集群)。 – Tommy 2012-07-26 17:12:19

1

你得到这个错误的原因是您要呼吁这似乎是一个布尔值,“长度”。无论哪种方式,用于检查一个字符串是否是空白这里有一些简单的方法,你可以通过一个类别的方式添加到NSString类:

-(BOOL)isBlank{ 
     return [[self trim] length]==0; 
    } 
    -(NSString *)trim{ 
     return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]; 
    } 

然后调用它,它只是:

[myString isBlank];