轉載自:blog.csdn.net/wzzvictory/…程序員
做者:wangzz數組
平時開發過程當中常常遇到這幾個表示空的關鍵字:nil
、Nil
、NULL
,一貫搞不清楚,做爲一個有兩年開發經驗的程序員,連那麼基礎的東西都不知道未免太丟人了。 首先要說明的是,nil
、Nil
、NULL
三個關鍵字和NSNull
類都是表示空,只是用處不同,具體的區別以下:ui
stddef.h文件spa
#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開發者來講,一般NULL
的定義就是: # define NULL ((void*)0)
。所以,NULL本質上是:(void*)0
.net
NULL
表示C指針爲空指針
char *string = NULL;
複製代碼
objc.h文件code
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
複製代碼
其中__has_feature(cxx_nullptr)
用於判斷C++中是否有nullptr
特性,對於普通iOS開發者來講,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
最終定義形式以下:blog
#define __DARWIN_NULL ((void *)0)
複製代碼
也就是說,nil
本質上是:(void *)0
開發
用於表示指向Objective-C中對象的指針爲空
NSString *string = nil;
id anyObject = nil;
複製代碼
objc.h文件
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
複製代碼
和上面講到的nil
同樣,Nil本質上也是:(void *)0
用於表示Objective-C類(Class
)類型的變量值爲空
Class anyClass = Nil;
複製代碼
NSNull.h文件
@interface NSNull : NSObject <NSCopying, NSSecureCoding>
+ (NSNull *)null;
@end
複製代碼
從定義中能夠看出,NSNull
是一個Objective-C類,只不過這個類至關特殊,由於它表示的是空值,即什麼都不存。它也只有一個單例方法+[NSUll null]
。該類一般用於在集合對象中保存一個空的佔位對象。
咱們一般初始化NSArray對象的形式以下:
NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil];
複製代碼
當NSArray
裏遇到nil
時,就說明這個數組對象的元素截止了,即NSArray
只關注nil
以前的對象,nil
以後的對象會被拋棄。好比下面的寫法:
NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil,@"foogry"];
複製代碼
這是NSArray
中只會保存wang
和zz
兩個字符串,foogry
字符串會被拋棄。 這種狀況,就可使用NSNull
實現:
NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",[NSNull null],@"foogry"];
複製代碼
從前面的介紹能夠看出,無論是NULL
、nil
仍是Nil
,它們本質上都是同樣的,都是(void *)0
,只是寫法不一樣。這樣作的意義是爲了區分不一樣的數據類型,好比你一看到用到了NULL
就知道這是個C指針,看到nil
就知道這是個Objective-C對象,看到Nil
就知道這是個Class類型的數據。