iOS stringWithFormat 空字符串的一个坑
2018-07-21 本文已影响41人
少卿阁下
一、叨逼逼一下
NSString怎样判断是否为空的方法网上一大堆,无非就是 nil、null、NULL这些东西, 不用多说。
今天写代码,发现一个很奇怪的事,明明是空字符串,NSLog打印出来是(null),调用是否为空的方法判断,结果竟然判断它不是空!当时我就震惊了。。。
二、正文
判空方法如下:
+ (BOOL)judgeIsEmptyWithString:(NSString *)string{
// NSLog(@"judgeIsEmptyWithString string length = %lu", (unsigned long)[string length]);
if ([string length] == 0){
NSLog(@"#### string length = 0");
return YES;
}
if (string == nil){
NSLog(@"#### string is nil");
return YES;
}
if (string == Nil){
NSLog(@"#### string is Nil");
return YES;
}
if (string == NULL){
NSLog(@"#### string is NULL");
return YES;
}
if ([string isKindOfClass:[NSNull class]]){
NSLog(@"#### string is Null");
return YES;
}
if ([string isEqual:@""]){
NSLog(@"#### string is eqeal @\"\"");
return YES;
}
if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0){
NSLog(@"#### string is space");
return YES;
}
return NO;
}
真相
后面我打印字符串的长度,竟然是6。。。不科学啊。经过一番排查,终于找到原因。
我们项目要记录一些东西到本地数据库,有一个NSString类型的字段,写数据库部分的同事调用了stringWithFormat把它格式化了一下。正常情况下这样没问题,但是当字符串为 nil 、NULL、Nil的时候,调用stringWithFormat最终得到的字符串就是 @"(null)"-------->长度变成6就是这个原因。
被NSLog 坑了,nil 这些空对象打印出来也是(null),谁能想到字符串本身就是(null)呢。。。。。
几个解决方案
1、初始化为一个有特定值的字符串(我初始化为@"",后面得到的值还是(null),我估计是存进数据库后又变成了空,再从数据库获取出来格式化就变成了(null))。
2、isEqual或isEqualToString直接判断是否等于@"(null)"。
3、不格式化空字符串。
测试打印
上面那个判断方法加1个 if 语句:
if ([string isEqual:@"(null)"]){
NSLog(@"#### string is eqeal @\"(null)\"");
return YES;
}
测试代码和打印输出:
NSString *test = @"";
NSString *test2 = [NSString stringWithFormat:@"%@", test];
NSLog(@"test2 = %@", test2);
[NSString judgeIsEmptyWithString:test2];
NSString *test3 = nil;
NSString *test4 = [NSString stringWithFormat:@"%@", test3];
NSLog(@"test4 = %@",test4);
[NSString judgeIsEmptyWithString:test4];
NSString *test5 = NULL;
NSString *test6 = [NSString stringWithFormat:@"%@", test5];
NSLog(@"test6 = %@", test6);
[NSString judgeIsEmptyWithString:test6];
NSString *test7 = Nil;
NSString *test8 = [NSString stringWithFormat:@"%@", test7];
NSLog(@"test8 = %@", test8);
[NSString judgeIsEmptyWithString:test8];
test2 =
#### string length = 0
test4 = (null)
#### string is eqeal @"(null)"
test6 = (null)
#### string is eqeal @"(null)"
test8 = (null)
#### string is eqeal @"(null)"