美文网首页
接口字段null处理、Nil、nil、NUll、[NSNULL

接口字段null处理、Nil、nil、NUll、[NSNULL

作者: 守护地中海的花 | 来源:发表于2020-10-19 18:40 被阅读0次
    21603097065_.pic.jpg

    展示(null)

    先看截图我截图的是其他地方 不过这个字段不过意思一样就行

    描述一下格式

    image.png

    response-data-(businessPcGetBillVo、sysAccount)
    businessPcGetBillVo->adminPhone、payType
    sysAccount->accountBank、、、、

    加一个服务器不存在字段test

    @property(nonatomic,copy)NSString *adminPhone;//预留手机号
    @property(nonatomic,copy)NSString *payType;
    @property(nonatomic,copy)NSString *test;
    

    打印键值对

    1.打印

    id payType = responseObject[@"data"][@"businessPcGetBillVo"][@"payType"];
    id adminPhone = responseObject[@"data"][@"businessPcGetBillVo"][@"adminPhone"];
    id test = responseObject[@"data"][@"businessPcGetBillVo"][@"test"];
    
    NSLog(@"%@",payType);
    NSLog(@"%@",adminPhone);
    NSLog(@"%@",test);
    
    ------ IncomeHomeVC.m ------ 122 行 ------ <null>
    ------ IncomeHomeVC.m ------ 123 行 ------ 18356052978
    ------ IncomeHomeVC.m ------ 124 行 ------ (null)
    

    总结:服务器返回未定义的字段 键值对打印方括号<> 不存在的字段圆括号() 对象寻址都是圆括号

    2.类型

    id payType = responseObject[@"data"][@"businessPcGetBillVo"][@"payType"];
    id adminPhone = responseObject[@"data"][@"businessPcGetBillVo"][@"adminPhone"];
    id test = responseObject[@"data"][@"businessPcGetBillVo"][@"test"];
    
    if ([payType isKindOfClass:[NSString class]]) {
        NSLog(@"payType是字符串");
    }
    if ([payType isKindOfClass:[NSNull class]]) {
        NSLog(@"payType是null");
    }
    
    if ([adminPhone isKindOfClass:[NSString class]]) {
        NSLog(@"adminPhone是字符串");
    }
    if ([adminPhone isKindOfClass:[NSNull class]]) {
        NSLog(@"adminPhone是null");
    }
    
    if ([test isKindOfClass:[NSString class]]) {
        NSLog(@"test是字符串");
    }
    if ([test isKindOfClass:[NSNull class]]) {
        NSLog(@"test是null");
    }
    
    ------ IncomeHomeVC.m ------ 136 行 ------ payType是null
    ------ IncomeHomeVC.m ------ 140 行 ------ adminPhone是字符串
    

    总结:payType 是NSNull类型 、test不存在的字段啥类型都不是

    4.字符串空

    if ([payType isEqualToString:@""]) {
        NSLog(@"payType是空字符串");
    }
    if ([adminPhone isEqualToString:@""]) {
        NSLog(@"adminPhone是空字符串");
    }
    if ([test isEqualToString:@""]) {
        NSLog(@"test是空字符串");
    }
    

    3.判断nil

    id payType = responseObject[@"data"][@"businessPcGetBillVo"][@"payType"];
    id adminPhone = responseObject[@"data"][@"businessPcGetBillVo"][@"adminPhone"];
    id test = responseObject[@"data"][@"businessPcGetBillVo"][@"test"];
    
    if (payType == nil) {
        NSLog(@"payType是nil");
    }
    if (adminPhone == nil) {
        NSLog(@"adminPhone是nil");
    }
    if (test == nil) {
        NSLog(@"test是nil");
    }
    
    ------ IncomeHomeVC.m ------ 160 行 ------ test是nil
    

    总结:不存在的字段键值对取值是nil

    4.打印空字符串

    if ([payType isEqualToString:@""]) {
        NSLog(@"payType是空字符串");
    }
    if ([adminPhone isEqualToString:@""]) {
        NSLog(@"adminPhone是空字符串");
    }
    if ([test isEqualToString:@""]) {
        NSLog(@"test是空字符串");
    }
    
    上面的payType 对比空字符串会闪退 不能对比的
    -[NSNull isEqualToString:]: unrecognized selector sent to instance 0x1f5d4df00
    
    然后test 不闪退也不是空字符串
    
    

    打印model对象

    1.打印

    NSLog(@"%@",responseModel.data.businessPcGetBillVo.payType);
    NSLog(@"%@",responseModel.data.businessPcGetBillVo.adminPhone);
    NSLog(@"%@",responseModel.data.businessPcGetBillVo.test);
    
    ------ IncomeHomeVC.m ------ 126 行 ------ (null)
    ------ IncomeHomeVC.m ------ 127 行 ------ 18356052978
    ------ IncomeHomeVC.m ------ 128 行 ------ (null)
    

    2.类型

    
    if ([responseModel.data.businessPcGetBillVo.payType isKindOfClass:[NSString class]]) {
        NSLog(@"payType是字符串");
    }
    if ([responseModel.data.businessPcGetBillVo.payType isKindOfClass:[NSNull class]]) {
        NSLog(@"payType是null");
    }
    
    if ([responseModel.data.businessPcGetBillVo.adminPhone isKindOfClass:[NSString class]]) {
        NSLog(@"adminPhone是字符串");
    }
    if ([responseModel.data.businessPcGetBillVo.adminPhone isKindOfClass:[NSNull class]]) {
        NSLog(@"adminPhone是null");
    }
    
    if ([responseModel.data.businessPcGetBillVo.test isKindOfClass:[NSString class]]) {
        NSLog(@"test是字符串");
    }
    if ([responseModel.data.businessPcGetBillVo.test isKindOfClass:[NSNull class]]) {
        NSLog(@"test是null");
    }
    
    ------ IncomeHomeVC.m ------ 140 行 ------ adminPhone是字符串
    

    3.判断nil

    if (responseModel.data.businessPcGetBillVo.payType == nil) {
        NSLog(@"payType是nil");
    }
    if (responseModel.data.businessPcGetBillVo.adminPhone == nil) {
        NSLog(@"adminPhone是nil");
    }
    if (responseModel.data.businessPcGetBillVo.test == nil) {
        NSLog(@"test是nil");
    }
    
    ------ IncomeHomeVC.m ------ 154 行 ------ payType是nil
    ------ IncomeHomeVC.m ------ 160 行 ------ test是nil
    

    4.判断字符串

    if ([responseModel.data.businessPcGetBillVo.payType isEqualToString:@""]) {
        NSLog(@"payType是空字符串");
    }
    if ([responseModel.data.businessPcGetBillVo.adminPhone isEqualToString:@""]) {
        NSLog(@"adminPhone是空字符串");
    }
    if ([responseModel.data.businessPcGetBillVo.test isEqualToString:@""]) {
        NSLog(@"test是空字符串");
    }
    啥都没有打印 
    

    总结
    通过对象属性 服务器返回的未定义字段和不存在的字段都是nil 对象判断nil

    如果想判断一个字符串是否为空

    后台返回正常类型 判断是否是@“”

    [xxxx isEqualToString:@""]
    

    如果后台返回不正常

    (xxx == nil)
    (responseModel.data.businessPcGetBillVo.payType == nil)
    

    键值对取的值不能对比空字符串 不然闪退

    id payType = responseObject[@"data"][@"businessPcGetBillVo"][@"payType"];
    [payType isEqual:[NSNull null]]
    
    [xxxxx isEqual:[NSNull null]]
    

    千万别拿键值对获取 未定义字段 对比字符串会崩溃的

    定义的宏

    空字符串放到后面 放到前面如果对比的是未定义键值对值 立马就闪退

    #define IsStrEmpty(_ref)    (((_ref) == nil) || ([(_ref) isEqual:[NSNull null]]) || ([(_ref)isEqualToString:@""]))
    

    其实单个属性也好 payType还是sysAccount是一样的

    如果sysAccount返回null 则定义的是对象 但是也是nil 然后键值对取出来的值也是NSNull 类型

    id sysAccount = responseObject[@"data"][@"sysAccount"];
    
    if ([sysAccount isEqual:[NSNull null]]) {
        NSLog(@"空的。。。wpp");
    }
    ------ IncomeHomeVC.m ------ 123 行 ------ 空的。。。wpp
    
    if (sysAccount == nil) {
        NSLog(@"空的。。。wpp");
    }
    不打印
    
    if (responseModel.data.sysAccount == nil) {
        NSLog(@"空的。。。wpp");
    }
    ------ IncomeHomeVC.m ------ 123 行 ------ 空的。。。wpp
    
    

    OC中Nil nil NULL 和 [NSNULL null]的区别

    • nil
      当一个对象置为nil时,这个对象的内存地址就会被系统收回。置空之后是不能进行retain,copy等跟引用计数有关的任何操作的。

    比如:

       NSMutableArray * array = [NSMutableArray array];
        NSDictionary * dic = [NSDictionary dictionary];
        id object = nil;
        [array addObject:object];
        [dic setValue:object forKey:@"key"];
    

    上述操作都是错误的

    • Nil
      nil完全等同于Nil,只不过由于编程习惯,人们一般把对象置空用nil,把类置空用Nil。
    • NULL
      这个是从C语言继承来的,就是一个简单的空指针
    • [NSNULL null]
      这个才是重点:[NSNull null]和nil的区别在于,nil是一个空对象,已经完全从内存中消失了,而如果我们想表达“我们需要有这样一个容器,但这个容器里什么也没有”的观念时,我们就用到[NSNull null],它就是为“值为空的对象”。如果你查阅开发文档你会发现NSNull这个类是继承NSObject,并且只有一个“+ (NSNull *) null;”类方法。这就说明NSNull对象拥有一个有效的内存地址,所以在程序中对它的任何引用都是不会导致程序崩溃的。

    相关文章

      网友评论

          本文标题:接口字段null处理、Nil、nil、NUll、[NSNULL

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