nil/Nil/NULL/NSNull的區別

轉載自:blog.csdn.net/wzzvictory/…程序員

做者:wangzz數組


平時開發過程當中常常遇到這幾個表示空的關鍵字:nilNilNULL,一貫搞不清楚,做爲一個有兩年開發經驗的程序員,連那麼基礎的東西都不知道未免太丟人了。 首先要說明的是,nilNilNULL三個關鍵字和NSNull類都是表示空,只是用處不同,具體的區別以下:ui

1、NULL

  1. 聲明位置

stddef.h文件spa

  1. 定義
#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

  1. 用處及含義

NULL表示C指針爲空指針

  1. 示例
char *string = NULL;
複製代碼

2、nil

  1. 聲明位置

objc.h文件code

  1. 定義
#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開發

  1. 用處及含義

用於表示指向Objective-C中對象的指針爲空

  1. 示例
NSString *string = nil;
id anyObject = nil;
複製代碼

3、Nil

  1. 聲明位置

objc.h文件

  1. 定義
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
複製代碼

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

  1. 用處及含義

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

  1. 示例
Class anyClass = Nil;
複製代碼

4、NSNull

  1. 聲明位置

NSNull.h文件

  1. 定義
@interface NSNull : NSObject <NSCopying, NSSecureCoding>
 
+ (NSNull *)null;
 
@end
複製代碼
  1. 用處及含義

從定義中能夠看出,NSNull是一個Objective-C類,只不過這個類至關特殊,由於它表示的是空值,即什麼都不存。它也只有一個單例方法+[NSUll null]。該類一般用於在集合對象中保存一個空的佔位對象。

  1. 示例

咱們一般初始化NSArray對象的形式以下:

NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil];
複製代碼

NSArray裏遇到nil時,就說明這個數組對象的元素截止了,即NSArray只關注nil以前的對象,nil以後的對象會被拋棄。好比下面的寫法:

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

這是NSArray中只會保存wangzz兩個字符串,foogry字符串會被拋棄。 這種狀況,就可使用NSNull實現:

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

5、總結

從前面的介紹能夠看出,無論是NULLnil仍是Nil,它們本質上都是同樣的,都是(void *)0,只是寫法不一樣。這樣作的意義是爲了區分不一樣的數據類型,好比你一看到用到了NULL就知道這是個C指針,看到nil就知道這是個Objective-C對象,看到Nil就知道這是個Class類型的數據。

相關文章
相關標籤/搜索