美文网首页< iOS >iOS程序员的业余沙龙
iOS stringWithFormat 空字符串的一个坑

iOS stringWithFormat 空字符串的一个坑

作者: 少卿阁下 | 来源:发表于2018-07-21 15:17 被阅读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)"
    

    相关文章

      网友评论

        本文标题:iOS stringWithFormat 空字符串的一个坑

        本文链接:https://www.haomeiwen.com/subject/fsyhmftx.html