Null、Nil、nil和NSNull的区别

NSNull是一个单例对象:
NSNull的声明:


+ (NSNull *)null;

@end

注意前方高能:

NULL、nil、Nil本质上没有任何区别都是一串0,别被它们不同的外表吓住。为什么会有这三个东西,完全是编程习惯,C语言的空指针习惯NULL,OC的对象习惯nil, OC的类对象习惯Nil。仅此而已。

验证:

        NSObject *a = nil;
        Class b = Nil;
        NSObject *c = NULL;
        void *d = nil;
        void *e = Nil;
        Class *f = nil;
        NSObject *__strong *g = Nil;
        NSLog(@"a = %d b = %d, c = %d, d = %d, e = %d, f = %d, g = %d", (int)a, (int)b, (int)c, (int)d, (int)e, (int)f, (int)g);
        [c description];
        [(NSObject *)nil description];
        [(NSObject *)NULL description];
        [(NSObject *)Nil description];

完全能正常运行

控制台打印输出:

2018-06-16 16:00:12.233633+0800 ockv[94870:19090179] a = 0 b = 0, c = 0, d = 0, e = 0, f = 0, g = 0

打断点观察发现xocde的变量窗口中:

Null、Nil、nil和NSNull的区别_第1张图片
xcode的变量窗口
  • C语言的指针和OC的二级指针都是NULL
  • OC对象都是nil
  • 至于为什么Class是0x0,我也不太清楚。

结论:Nil、nil、NULL三者本质都是一样的,都是0,上述变量的实质都是指针,指针里面的值都是0。而NSNull是一个对象。

你可能感兴趣的:(Null、Nil、nil和NSNull的区别)