iOS - 检查字符串是否为空时的异常

时间:2012-07-26 17:02:29

标签: objective-c ios xcode ios5

我正在做这样的事情:

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

知道为什么我会得到例外吗?我不认为我在做什么有什么不妥。

谢谢!

2 个答案:

答案 0 :(得分:5)

此:

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

返回NSNumber(因为NSCFBooleanNSNumber的私有子类)而不是字符串。因此,它没有实现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];