Contents
  • NULL

c语法中的指针

1
char *p = NULL;
  • nil

ObjC 对象的字面空值,对应 id 类型的对象

1
2
3
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
  • Nil

ObjC 类类型的书面空值,对应 Class 类型对象

1
2
Class someClass = Nil;
Class anotherClass = [NSString class];
  • [NSNull null]

  • 用于表示集合 NSArray/NSSet/NSDictionary中值为空值对象

  • 因为 nil 被用来用为集合结束的标志,所以 nil 不能存储在 Foundation 集合里
1
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
  • nil 不能出现在 集合对象中
1
2
3
4
5
6
7
// 错误的使用
  NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:nil forKey:@"someKey"];
      
        // 正确的使用
          NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            [dict setObject:[NSNull null] forKey:@"someKey"];

            
            也就是说,集合对象如果要设置一个空值对象,必须要设置[NSNull null]得到的单例对象.
            
            - kCFNull
            
            是一个宏定义,其实就是NSNull的单例
            
            

1
            const CFNullRef kCFNull;    // the singleton null instance

            
            测试下
            
            

1
2
            NSNull *null1 = (id)kCFNull;
            NSNull *null2 = [NSNull null];

            
            输出信息
            
            

1
2
            (NSNull *) null1 = 0x0000000107b10af0
            (NSNull *) null2 = 0x0000000107b10af0

            
            哈哈,其实 kCFNull这个宏 === [NSNull null]这一句代码
            
            ***
            
            小结下 nil 与 [NSNull null] 的区别:
            
            - nil:
            - Objc对象不存在,既内存地址 都没有
            
            - [NSNull null]:
            - 得到是一个单例对象,是有内存地址
            - 可以设置到集合对象中,而nil则不能够设置到集合对象中

Contents