< iOS >iOS程序员的业余沙龙

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)"
上一篇下一篇

猜你喜欢

热点阅读