在程序中使用一个字符串之前, 判断它是否为空是很有必要的, 否则程序就可能会出现bug或者崩溃.
一个NSString字符串为空, 通常意味着四种情况:
1.NSString对象没有初始值
NSString *aStr; // 声明了一个字符串变量, 未设置初始值
此时, 要判断它是否为空, 只需这样:
if (aStr == nil) {
// 字符串为空
}
我曾经查阅过很多文章, 发现几乎所有人都是这样写的:
if (aStr == nil || aStr == NULL) {
// 字符串为空
}
多了一个判断条件, aStr == NULL, 个人认为这虽然显得更谨慎一些, 但却是不必要的. 因为NULL是表示C语言中的空指针, 而NSString字符串是Objective-C中的对象, 它的空值就用nil来表示. 虽然nil和NULL在数值上都等于0, 但是它们的应用场景还是有些区别的. 既然如此, 就很容易想到一种更为简洁通用的写法:
if (!aStr) {
// 字符串为空
}
只要aStr的指针值为0, 就可断定它为空, 干净利落而又考虑全面.
2.期望得到一个NSString字符串, 但却不幸遇到了NSNull
这种情形多见于从后台请求回来数据进行JSON解析的时候, 如果解析出的NSDictionary中某个key对应的value为空, 则系统会把它处理为NSNull类的单例对象(因为NSArray和NSDictionary中都不能存储nil). 此时, 如果不加判断就贸然使用这个”字符串”, 那么APP就很有可能会崩溃. So, 怎么判断呢? 也很简单:
if ([aStr isKindOfClass:[NSNull class]]) {
// 字符串为空
}
3.字符串中没有任何字符, 也就是长度为0
判断这种情况就比较简单了:
if (!aStr.length) {
// 字符串为空
}
4.字符串中除了空格和换行以外没有任何字符
对于这种情况, 可以借助字符集类NSCharacterSet和NSString类的一个方法来做判断, 具体代码如下:
// 创建一个字符集对象, 包含所有的空格和换行字符
NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
// 从字符串中过滤掉首尾的空格和换行, 得到一个新的字符串
NSString *trimmedStr = [aStr stringByTrimmingCharactersInSet:set];
// 判断新字符串的长度是否为0
if (!trimmedStr.length) {
// 字符串为空
}
实际上, 第三种情况和第四种情况在本质上是一样的, 都表示字符串中没有任何有效的字符. 我们可以省去第三步判断, 直接进行第四步判断, 也能得到正确的结果, 之所以加上第三步的判断, 是为了提高性能, 避免第四步不必要的字符串处理过程, 节省时间和空间开销.
好了, 至此就得到全面判断字符串为空的方法了:
- (BOOL)isBlankString:(NSString *)aStr {
if (!aStr) {
return YES;
}
if ([aStr isKindOfClass:[NSNull class]]) {
return YES;
}
if (!aStr.length) {
return YES;
}
NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSString *trimmedStr = [aStr stringByTrimmingCharactersInSet:set];
if (!trimmedStr.length) {
return YES;
}
return NO;
}
学无止境, 水平有限. 文中若有错误和不当, 欢迎大家拍砖指正~