美文网首页
Objective-C中nil、Nil、NULL和NSNull的

Objective-C中nil、Nil、NULL和NSNull的

作者: 小哥_xiaoge | 来源:发表于2022-05-17 13:05 被阅读0次

    在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别:

    Symbol Value Meaning
    nil (id)0 指向Objective-C对象的空指针
    Nil (Class)0 指向Objective-C类的空指针
    NULL (void *)0 指向如 基本类型、C类型 的空指针
    NSNull [NSNull null] 用于表示空值的单例对象(通常表示集合中的空值)

    一、nil

    我们给对象赋值时一般会使用object = nil,表示把这个对象释放掉;或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对象为nil,我称它为 空对象
    所以对于这种空对象有关retainrelease的操作都会引起程序崩溃。

    NSObject *obj = nil;
    if (nil == obj) {
        NSLog(@"obj is nil");
      }else {
        NSLog(@"obj is not nil");
      }
    

    二、Nil

    nilNil在使用上是没有严格限定的,也就是说凡是使用nil的地方都可以用Nil来代替,反之亦然。只不过从编程人员的规约中我们约定俗成地将nil表示一个空对象,Nil表示一个空类(只能说可读性和规范问题吧,最好遵守)。

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

    三、NULL

    我们知道Object-C来源于 C语言、支持于 C语言,当然也有别于 C语言。而NULL就是典型 C语言 的语法,它表示一个空指针。

    用于 C语言 的各种数据类型的指针为空。例如:

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

    四、NSNull

    如果我们想表达“我们需要有这样一个容器,但这个容器里什么也没有”的观念时,我们就用到NSNull,我称它为“值为空的对象”。如果你查阅开发文档你会发现NSNull这个类是继承NSObject,并且只有一个+ (NSNull *) null;类方法。这就说明NSNull对象拥有一个有效的内存地址,所以在程序中对它的任何引用都是不会导致程序崩溃的。

    @interface NSNull : NSObject <NSCopying, NSSecureCoding>
     
    + (NSNull *)null;
     
    @end
    

    如NSArray、NSSet和NSDictionary等集合对象无法包含 nil 作为其具体值。所以nil 值用一个特定的对象 NSNull来表示。NSNull 提供了一个单一实例用于表示对象属性中的的nil值。

    NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
    //  为 `akey`设置一个NSNull单例的值
    mutableDictionary[@"aKey"] = [NSNull null]; 
    

    五、有趣的例子

    例1:nil在数组中的意义

    NSObject *obj1 = [[NSObject alloc] init];
    NSObject *obj2 = [NSNull null];
    NSObject *obj3 = [NSObject new];
    NSObject *obj4;
    NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];
    NSLog(@"arr1 count: %ld", [arr1 count]);    //arr1 count: 3
     
     
    NSObject *obj1;
    NSObject *obj2 = [[NSObject alloc] init];
    NSObject *obj3 = [NSNull null];
    NSObject *obj4 = [NSObject new];
    NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];
    NSLog(@"arr2 count: %ld", [arr2 count]);   //arr2 count: 0
    

    为什么arr1有3个元素,而arr2元素个数为0 ?
    NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];
    nil 意味着数组添加元素结束,而obj1是nil,所以。。。

    例2:注意判断数组元素的类型!

       //有异常!
        NSObject *obj1 = [NSNull null];
        NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];
        for (NSString *str in arr1) {  // 遍历到obj1时cash
            NSLog(@"array object: %@", [str lowercaseString]);
        }
    
        //修改
        NSObject *obj1 = [NSNull null];
        NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];
        for (NSString *str in arr1) {
            if (![str isEqual:[NSNull null]]){
                NSLog(@"array object: %@", [str lowercaseString]);
            }
        }
    

    相关文章

      网友评论

          本文标题:Objective-C中nil、Nil、NULL和NSNull的

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