最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年08月01日 17:27:44   投稿:daisy  
相信有不少朋友想知道,在 Objective-C 中 nil 和 Nil 以及 NULL 的區(qū)別。最重要的是,在面試中還有不少朋友常會(huì)被問(wèn)到?,F(xiàn)在小編在這里統(tǒng)一詳細(xì)說(shuō)明。

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è)指針就成了所謂的野指針,然后其它地方不小心訪問(wèn)了這個(gè)指針是很容易造成非法訪問(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 ??聪鹿俜蕉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 開(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ì)腳本之家的支持。

相關(guān)文章

  • C++ 之explicit關(guān)鍵字

    C++ 之explicit關(guān)鍵字

    今天我們來(lái)談?wù)凜++中的explicit關(guān)鍵字,這篇文章詳細(xì)介紹了C語(yǔ)言的關(guān)鍵字explicit關(guān)鍵字,本文有詳細(xì)的代碼實(shí)例,感興趣的同學(xué)可以借鑒參考
    2023-04-04
  • C語(yǔ)言中文件處理全攻略詳解

    C語(yǔ)言中文件處理全攻略詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中文件處理的相關(guān)知識(shí),包括創(chuàng)建、寫(xiě)入、追加操作解析,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-01-01
  • 用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符的深入探討

    用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符的深入探討

    本篇文章是對(duì)用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中signed?main和int?main的區(qū)別

    C++中signed?main和int?main的區(qū)別

    這篇文章介紹了C++中signed?main和int?main的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C++實(shí)現(xiàn)簡(jiǎn)單的信息管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單的信息管理系統(tǒng)

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)簡(jiǎn)單的信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • qt中sokect斷開(kāi)的幾種情況

    qt中sokect斷開(kāi)的幾種情況

    本文主要介紹了qt中sokect斷開(kāi)的幾種情況,文中介紹了很多情況,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • 分享常用的3個(gè)C++小技巧

    分享常用的3個(gè)C++小技巧

    這篇文章主要分享了常用的3個(gè)C++小技巧,
    2021-12-12
  • C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑)

    C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法

    詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法

    這篇文章主要介紹了C++中const_cast與reinterpret_cast運(yùn)算符的用法,經(jīng)常被用于表達(dá)式中的類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下
    2016-01-01
  • QT實(shí)現(xiàn)用戶登錄注冊(cè)

    QT實(shí)現(xiàn)用戶登錄注冊(cè)

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)用戶登錄注冊(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

高平市| 德昌县| 清水县| 高台县| 武鸣县| 东乌珠穆沁旗| 嘉善县| 中阳县| 临汾市| 鄂州市| 南乐县| 永泰县| 五常市| 富阳市| 密山市| 清徐县| 水城县| 南乐县| 牙克石市| 兰坪| 乌兰县| 佛教| 枣阳市| 陇南市| 定西市| 莱州市| 利辛县| 朝阳区| 浠水县| 江源县| 钟山县| 炉霍县| 土默特左旗| 汽车| 安阳县| 泸西县| 茂名市| 乐亭县| 嘉祥县| 彩票| 舒兰市|