總結(jié)IOS中nil、Nil、NULL和NSNull區(qū)別
NULL
對(duì)于學(xué)習(xí)過(guò) C/C++ 語(yǔ)言的朋友,對(duì) NULL 一定很熟悉吧?這就是在 C/C++ 中的空指針。
在 C 語(yǔ)言中, NULL 是無(wú)類(lèi)型的,只是一個(gè)宏,它代表空。我們不研究 C++ 中的 NULL ,因?yàn)樵?C++11 以后又有了新的定義,我們不深究。
這就是 C 語(yǔ)言中所謂的 NULL ( C++ 的定義比較復(fù)雜,這里不說(shuō)了):
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 開(kāi)發(fā)來(lái)說(shuō), NULL 就表示 ((void*)0)
像 C 語(yǔ)言中,我們定義了一個(gè)指針,當(dāng)我們使用完以后,通常會(huì)設(shè)置指向 NULL 。如果沒(méi)有設(shè)置,這個(gè)指針就成了所謂的野指針,然后其它地方不小心訪(fǎng)問(wèn)了這個(gè)指針是很容易造成非法訪(fǎng)問(wèn)的,常見(jiàn)的表現(xiàn)就是崩潰了。
既然 Objective-C 是基于 C 語(yǔ)言的面向?qū)ο笳Z(yǔ)言,那么也會(huì)使用到 C 語(yǔ)言類(lèi)型的指針,比如使用 const char *
類(lèi)型,判斷是否為空時(shí),是使用 p != NULL
來(lái)判斷的。
nil
對(duì)于我們學(xué)習(xí) Objective-C 的人來(lái)說(shuō),這個(gè)是非常熟悉的。如下為官方定義:
Objective-C
#ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif
對(duì)于我們 Objective-C 開(kāi)發(fā)來(lái)說(shuō), nil 就是 __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 開(kāi)發(fā)來(lái)說(shuō), 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 開(kāi)發(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 開(kāi)發(fā)來(lái)說(shuō), Nil 也就代表 ((void *)0)
。
但是它是用于代表空類(lèi)的。比如:
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
的類(lèi)型。它是很特殊的類(lèi),它表示是空,什么也不存儲(chǔ),但是它卻是對(duì)象,只是一個(gè)占位對(duì)象。
使用場(chǎng)景就不一樣了,比如說(shuō)服務(wù)端接口中讓我們?cè)谥禐榭諘r(shí),傳空。
Objective-C
NSDictionry *parameters = @{@"arg1" : @"value1", @"arg2" : arg2.isEmpty ? [NSNull null] : arg2};
這只是隨手舉的例子,當(dāng)然我們也可以不傳這人參數(shù)。如果我們要統(tǒng)一,比如通過(guò) runtime
來(lái)動(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 語(yǔ)言指針而使用的,表示空指針
nil 是宏,是對(duì)于 Objective-C 中的對(duì)象而使用的,表示對(duì)象為空
Nil 是宏,是對(duì)于 Objective-C 中的類(lèi)而使用的,表示類(lèi)指向空
NSNull 是類(lèi)類(lèi)型,是用于表示空的占位對(duì)象,與 JS 或者服務(wù)端的 null 類(lèi)似的含意
總結(jié)
以上只是小編的個(gè)人見(jiàn)解,如果疑問(wèn)之處,歡迎留言討論,謝謝大家對(duì)我們的支持。
上一篇:C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合性實(shí)例詳解
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言邏輯運(yùn)算符知識(shí)整理
本文標(biāo)題:總結(jié)IOS中nil、Nil、NULL和NSNull區(qū)別
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2148.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?