我正在做这样的事情:
// 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'
知道为什么我会得到例外吗?我不认为我在做什么有什么不妥。
谢谢!
答案 0 :(得分:5)
此:
NSString *user_id = [standardUserDefaults objectForKey:@"user_id"];
返回NSNumber
(因为NSCFBoolean
是NSNumber
的私有子类)而不是字符串。因此,它没有实现length
,导致异常。
也许你想测试[user_id intValue] > 0
?即使你把它转换成一个字符串,它总会有一些长度。
(提出的附带问题:仅仅声明user_id
作为对NSString
的引用并不意味着你分配给它的任何东西神奇地变成了一个字符串;实际上没有类型对象类型的强制效果编译器没有抱怨,因为NSUserDefaults
返回类型为id
的对象,即它保证它们是对象,但没有声明它们的类型,编译器也不知道。可以在id
之间强制转换所有对象而不生成警告,以便可以由诸如用户默认值NSArray
等类使用它,只要它是一个可以接受的任何内容。对象)。
编辑:根据评论中提出的问题,听起来最初存储的内容可能不是字符串。验证Web内容的好方法可能是:
// 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 :(得分:1)
你得到这个错误的原因是你试图在看似是布尔值的东西上调用'length'。无论哪种方式,为了检查字符串是否为空,这里有一些简单的方法可以通过类别添加到NSString类:
-(BOOL)isBlank{
return [[self trim] length]==0;
}
-(NSString *)trim{
return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
}
然后调用它只是:
[myString isBlank];