通過(guò)查看 objc/objc.h和objc/objc-api.h這兩個(gè)頭文件谦去。
objc/objc-api.h
#ifndef __DARWIN_NULL
#define __DARWIN_NULL NULL
#endif
objc/objc.h
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
另外定義了:
#define NULL ((void *)0)
可見(jiàn)在Objective-C中慷丽,nil,Nil鳄哭,NULL其實(shí)是等價(jià)的要糊。
可以通過(guò)代碼進(jìn)行驗(yàn)證。
NSLog(@"nil == Nil: %d", (nil == Nil));
NSLog(@"nil == NULL: %d", (nil == NULL));
NSLog(@"Nil == NULL: %d", (Nil == NULL));
結(jié)果:
2019-06-27 23:44:02.723625+0800 study[7658:122899] nil == Nil: 1
2019-06-27 23:44:02.723800+0800 study[7658:122899] nil == NULL: 1
2019-06-27 23:44:02.723887+0800 study[7658:122899] Nil == NULL: 1
下面說(shuō)一下各自的含義:
nil妆丘,Objective-C中的對(duì)象而使用的锄俄,表示對(duì)象為空,當(dāng)一個(gè)對(duì)象置為nil時(shí)勺拣,這個(gè)對(duì)象的內(nèi)存地址就會(huì)被系統(tǒng)收回奶赠。置空之后是不能進(jìn)行retain,copy等跟引用計(jì)數(shù)有關(guān)的任何操作的药有;
Nil毅戈,Objective-C中的類而使用的,表示類指向空塑猖;
NULL竹祷,C語(yǔ)言指針而使用的谈跛,表示空指針羊苟;
NSNull,繼承于NSObject的類型感憾,并且只有一個(gè)“+ (NSNull *) null蜡励;”類方法。它表示是空阻桅,什么也不存儲(chǔ)凉倚,但是它卻是對(duì)象,只是一個(gè)占位對(duì)象嫂沉。NSNull對(duì)象擁有一個(gè)有效的內(nèi)存地址稽寒。不像nil是一個(gè)空對(duì)象,已經(jīng)完全從內(nèi)存中消失趟章;
+ (NSNull *)null;
tips:
空對(duì)象和值為空的對(duì)象的區(qū)別:
- “空對(duì)象”是已經(jīng)釋放了內(nèi)存地址的對(duì)象杏糙,即不存在的對(duì)象(nil,Nil);
- “值為空的對(duì)象”是分配了地址蚓土,但是沒(méi)有值得對(duì)象宏侍,是實(shí)際存在的對(duì)象([NSNull null]);