nil Nil NULL NSNull的區(qū)別

一、NULL

1、聲明位置

stddef.h文件

2、定義

#undef NULL

#ifdef __cplusplus

#? if !defined(__MINGW32__) && !defined(_MSC_VER)

#? ? define NULL __null

#? else

#? ? define NULL 0

#? endif

#else

#? define NULL ((void*)0)

#endif

其中__cplusplus表示是不是C++代碼,所以對于普通的iOS開發(fā)者來說,通常NULL的定義就是:

# define NULL ((void*)0)

因此,NULL本質(zhì)上是:(void*)0

3、用處及含義

NULL表示C指針為空

4、示例

char *string = NULL;

二、nil

1、聲明位置

objc.h文件

2、定義

#ifndef nil

# if __has_feature(cxx_nullptr)

#? define nil nullptr

# else

#? define nil __DARWIN_NULL

# endif

#endif

其中__has_feature(cxx_nullptr)用于判斷C++中是否有nullptr特性,對于普通iOS開發(fā)者來說,nil的定義形式為:

# define nil __DARWIN_NULL

就是說nil最終是__DARWIN_NULL的宏定義,__DARWIN_NULL是定義在_types.h中的宏,其定義形式如下:

#ifdef __cplusplus

#ifdef __GNUG__

#define __DARWIN_NULL __null

#else /* ! __GNUG__ */

#ifdef __LP64__

#define __DARWIN_NULL (0L)

#else /* !__LP64__ */

#define __DARWIN_NULL 0

#endif /* __LP64__ */

#endif /* __GNUG__ */

#else /* ! __cplusplus */

#define __DARWIN_NULL ((void *)0)

#endif /* __cplusplus */

非C++代碼的__DARWIN_NULL最終定義形式如下

#define __DARWIN_NULL ((void *)0)

也就是說,nil本質(zhì)上是:(void *)0

3、用處及含義

用于表示指向Objective-C中對象的指針為空

4、示例

NSString *string = nil;

id anyObject = nil;

三、Nil

1、聲明位置

objc.h文件

2、定義

#ifndef Nil

# if __has_feature(cxx_nullptr)

#? define Nil nullptr

# else

#? define Nil __DARWIN_NULL

# endif

#endif

和上面講到的nil一樣,Nil本質(zhì)上也是:(void *)0

3、用處及含義

用于表示Objective-C類(Class)類型的變量值為空

4、示例

Class anyClass = Nil;

四、NSNull

1、聲明位置

NSNull.h文件

2、定義

@interface NSNull : NSObject

+ (NSNull *)null;

@end

3、用處及含義

從定義中可以看出,NSNull是一個Objective-C類,只不過這個類相當(dāng)特殊,因為它表示的是空值,即什么都不存。它也只有一個單例方法+[NSUll null]。該類通常用于在集合對象中保存一個空的占位對象。

4、示例

我們通常初始化NSArray對象的形式如下:

NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil];

當(dāng)NSArray里遇到nil時,就說明這個數(shù)組對象的元素截止了,即NSArray只關(guān)注nil之前的對象,nil之后的對象會被拋棄。比如下面的寫法:

NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil,@"foogry"];

這是NSArray中只會保存wang和zz兩個字符串,foogry字符串會被拋棄。

這種情況,就可以使用NSNull實現(xiàn)

NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",[NSNull null],@"foogry"];

五、總結(jié)

從前面的介紹可以看出,不管是NULL、nil還是Nil,它們本質(zhì)上都是一樣的,都是(void *)0,只是寫法不同。這樣做的意義是為了區(qū)分不同的數(shù)據(jù)類型,比如你一看到用到了NULL就知道這是個C指針,看到nil就知道這是個Objective-C對象,看到Nil就知道這是個Class類型的數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容