NULL
對(duì)于學(xué)習(xí)過 C/C++ 語言的朋友,對(duì) NULL 一定很熟悉吧?這就是在 C/C++ 中的空指針。
在 C 語言中, NULL 是無類型的,只是一個(gè)宏,它代表空。我們不研究 C++ 中的 NULL ,因?yàn)樵?C++11 以后又有了新的定義,我們不深究。
這就是 C 語言中所謂的 NULL ( C++ 的定義比較復(fù)雜,這里不說了):
Objective-C
#if defined(__need_NULL)#undef NULL#ifdef __cplusplus# if !defined(__MINGW32__) && !defined(_MSC_VER)# define NULL __null# else# define NULL 0# endif#else# define NULL ((void*)0)#endif
這是在 stddef.h 頭文件中聲明的。這是使用了條件編譯的, __cplusplus 這個(gè)宏表示 C++ ,對(duì)于我們 Objective-C 開發(fā)來說, NULL 就表示 ((void*)0)
像 C 語言中,我們定義了一個(gè)指針,當(dāng)我們使用完以后,通常會(huì)設(shè)置指向 NULL 。如果沒有設(shè)置,這個(gè)指針就成了所謂的野指針,然后其它地方不小心訪問了這個(gè)指針是很容易造成非法訪問的,常見的表現(xiàn)就是崩潰了。
既然 Objective-C 是基于 C 語言的面向?qū)ο笳Z言,那么也會(huì)使用到 C 語言類型的指針,比如使用 const char * 類型,判斷是否為空時(shí),是使用 p != NULL 來判斷的。
nil
對(duì)于我們學(xué)習(xí) Objective-C 的人來說,這個(gè)是非常熟悉的。如下為官方定義:
Objective-C
#ifndef nil# if __has_feature(cxx_nullptr)# define nil nullptr# else# define nil __DARWIN_NULL# endif#endif
對(duì)于我們 Objective-C 開發(fā)來說, nil 就是 __DARWIN_NULL ??聪鹿俜蕉x:
Objective-C
#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 */
這個(gè)也是條件編譯的,那么對(duì)于我們 Objective-C 開發(fā)來說, nil 就代表 ((void *)0) 。
我們使用 nil 表示 Objective-C 對(duì)象為空,如 NSString *str = nil 。
Nil
先看看官方是如何聲明的:
Objective-C
#ifndef Nil# if __has_feature(cxx_nullptr)# define Nil nullptr# else# define Nil __DARWIN_NULL# endif#endif
根據(jù)條件,我們做 Objective-C 開發(fā)的,那么 Nil 也就是代表 __DARWIN_NULL ,而對(duì)于 __DARWIN_NULL 的聲明如下:
Objective-C
#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 */
這個(gè)也是條件編譯的,那么對(duì)于我們 Objective-C 開發(fā)來說, Nil 也就代表 ((void *)0) 。
但是它是用于代表空類的。比如:
Objective-C
Class myClass = Nil;
NSNull
先看看官方的聲明:
Objective-C
NS_ASSUME_NONNULL_BEGIN @interfaceNSNull: NSObject <NSCopying, NSSecureCoding> + (NSNull *)null; @end NS_ASSUME_NONNULL_END
由此我們可知, NSNull 是繼承于 NSObject 的類型。它是很特殊的類,它表示是空,什么也不存儲(chǔ),但是它卻是對(duì)象,只是一個(gè)占位對(duì)象。
使用場(chǎng)景就不一樣了,比如說服務(wù)端接口中讓我們?cè)谥禐榭諘r(shí),傳空。
Objective-C
NSDictionry *parameters = @{@"arg1" : @"value1", @"arg2" : arg2.isEmpty ? [NSNull null] : arg2}; 這只是隨手舉的例子,當(dāng)然我們也可以不傳這人參數(shù)。如果我們要統(tǒng)一,比如通過 runtime 來動(dòng)態(tài)將對(duì)象轉(zhuǎn)成我們的參數(shù)時(shí),那么可以統(tǒng)一將值為 nil 的都設(shè)置為 [NSNull null]
區(qū)別
NULL 、 nil 、 Nil 這三者對(duì)于 Objective-C 中值是一樣的,都是 (void *)0 ,那么為什么要區(qū)分呢?又與 NSNull 之間有什么區(qū)別:
NULL 是宏,是對(duì)于 C 語言指針而使用的,表示空指針
nil 是宏,是對(duì)于 Objective-C 中的對(duì)象而使用的,表示對(duì)象為空
Nil 是宏,是對(duì)于 Objective-C 中的類而使用的,表示類指向空
NSNull 是類類型,是用于表示空的占位對(duì)象,與 JS 或者服務(wù)端的 null 類似的含意
總結(jié)
以上只是小編的個(gè)人見解,如果疑問之處,歡迎留言討論,謝謝大家對(duì)VEVB武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注