国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

總結(jié)IOS中nil、Nil、NULL和NSNull區(qū)別

2019-10-21 18:53:30
字體:
供稿:網(wǎng)友

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)的支持。

 


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赤峰市| 青河县| 库伦旗| 新田县| 乌苏市| 夏河县| 镇江市| 五家渠市| 丹江口市| 宝坻区| 湛江市| 习水县| 大丰市| 仁怀市| 巩义市| 镶黄旗| 新源县| 定州市| 施秉县| 盘山县| 综艺| 巫山县| 扶绥县| 大新县| 洛川县| 西城区| 阳原县| 睢宁县| 凤城市| 句容市| 景东| 称多县| 石门县| 中方县| 漠河县| 东乡族自治县| 新营市| 广饶县| 济宁市| 文昌市| 宁陵县|