• objective-C nil,Nil,NULL之间的不同


    在看书的时候突然看到一个问题,就是关于nil,Nil,NULL有什么不同,怎么使用?

    查了一下,在stack overflow上面看到一个很nice的解释,翻译记录一下下。

    nil

    首先,nil是指一个OC对象的空值表达,如下:

    NSString *someString = nil;
    NSURL *someURL = nil;
    id someObject = nil;
    if (anotherObject == nil) // do something
    

    Nil

    而Nil则是对于OC Class的空值表达,一般不太会涉及到用一个变量来引用Class,所以,不是很常用。

    Class someClass = Nil;
    Class anotherClass = [NSString class];
    

    NULL

    NULL是对任意C 指针的空值表达。

    int *pointerToInt = NULL;
    char *pointerToChar = NULL;
    struct TreeNode *rootNode = NULL;
    

    NSNull

    NSNull是代表一个空值对象的类,意思是,在Class中,返回+ [NSNull null]的那个对象。

    它和nil是不同的,因为nil是字面空值,也就是说,nil不是一个对象。

    对于single instance来说,NSNull 它可以被看作是一个对象。

    NSNull经常用于Foundation集合中因为它们不能存储空值,对于字典,objectForKey: 返回ni意味着给定的键值在字典中没有对应的对象,即,该key值还没有被添加到字典中。

    如果关于某个key还没有值,但你想明确表达出来,可以使用[NSNull null]。

    下面的表达是违法的,字典中对象不能为nil

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:nil forKey:@"someKey"];
    

    下面是有效的,前面说过,NSNull可以被看作是一个对象。

    NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];
    [dict1 setObject:[NSNull null] forKey:@"someKey"];
    NSLog(@"dic %@",dict1);
    --
    dic {
      someKey = "<null>";
    }
    

    值得一提的是,Foundation集合的初始化动作使用nil作为对象列表结尾的标记,而不必指定列表中元素的数量。这种情况是因为nil无法存储在Foundation集合中。例如,

    NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
    
  • 相关阅读:
    Python实现天数倒计时计算
    pandas 的数据结构Series与DataFrame
    在python中使用静态方法staticmethod
    python 中对list做减法操作
    推荐系统之 BPR 算法及 Librec的BPR算法实现【1】
    机器学习中的 ground truth
    PyCharm 默认运行 unittest
    Python的copy()与deepcopy()区别
    MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景
    Spring Boot 返回 JSON 数据,一分钟搞定!
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/12658806.html
Copyright © 2020-2023  润新知