SDWebImage源碼后關(guān)于NS_OPTIONS和NS_ENUM的一點(diǎn)認(rèn)識

提要

花了幾天斷斷續(xù)續(xù)的讀了下SDWebImage的源碼,無意細(xì)心看了兩個宏定義NS_OPTIONS和NS_ENUM

typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions)
typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder)

兩種宏定義,雖然平時(shí)開發(fā)過程當(dāng)中大家采用第二種居多九杂,本著好奇鸵贬,研究了下這兩者的區(qū)別,以便識記屎媳。
本質(zhì)都是枚舉夺溢,用法就不扯淡了论巍,本篇主要看看二者的本質(zhì)差異。

Test示例

新建一個工程看看

typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) {
    SDWebImageDownloaderLowPriority = 1 << 0
};
typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
    SDWebImageDownloaeExecutionOrder = 1 << 0
};

我們扒開她的衣服查看異同:

1.Xcode Preprocess

Xcode右上下拉點(diǎn)擊Preprocess將宏定義展開风响,展開后如下所示

typedef enum SDWebImageDownloaderOptions : NSUInteger SDWebImageDownloaderOptions; enum SDWebImageDownloaderOptions : NSUInteger {
    SDWebImageDownloaderLowPriority = 1 << 0
};

typedef enum SDWebImageDownloaderExecutionOrder : NSInteger SDWebImageDownloaderExecutionOrder; enum SDWebImageDownloaderExecutionOrder : NSInteger {
    SDWebImageDownloaeExecutionOrder = 1 << 0
};

這里你可以看到二者沒有任何差別嘉汰,那么Apple 為何要這么聲明呢?看來單純的展開并不能找到答案

2.深入Foundation

#define NS_ENUM(...) CF_ENUM(__VA_ARGS__)
#define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)

CF_ENUM状勤、CF_OPTIONS進(jìn)行了中轉(zhuǎn)鞋怀,那么我們繼續(xù)深入CoreFoundation/CFAvailability.h查看

// Enums and Options
#define __CF_ENUM_GET_MACRO(_1, _2, NAME, ...) NAME
#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
#define __CF_NAMED_ENUM(_type, _name)     enum _name : _type _name; enum _name : _type
#define __CF_ANON_ENUM(_type)             enum : _type
#if (__cplusplus)
#define CF_OPTIONS(_type, _name) _type _name; enum : _type
#else
#define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
#endif
#else
#define __CF_NAMED_ENUM(_type, _name) _type _name; enum
#define __CF_ANON_ENUM(_type) enum
#define CF_OPTIONS(_type, _name) _type _name; enum
#endif

看到這里,差不多知道二者本質(zhì)區(qū)別持搜,多了cplusplus條件編譯密似,Apple這樣做根本上還是考慮到編譯器的兼容性

用法上NS_OPTIONS通常適合定義bitmask做位移組合運(yùn)算OR(|)、AND(&)朵诫,當(dāng)然在Objective-C編譯選項(xiàng)下也可以用NS_ENUM沒有任何區(qū)別辛友,但是編譯選項(xiàng)在C++\Objective-C++下就會出現(xiàn)問題,C++ 編譯選項(xiàng)下會導(dǎo)致類型不能強(qiáng)轉(zhuǎn)造成的編譯問題(譬如enum MyEnumType aVar = MyEnumType1 | MyEnumType2; 不能執(zhí)行賦值操作)剪返,所以要使用NS_OPTIONS废累,做了編譯器兼容c++下都是NSInteger類型這樣就不會編譯出問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脱盲,一起剝皮案震驚了整個濱河市邑滨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钱反,老刑警劉巖掖看,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異面哥,居然都是意外死亡哎壳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門尚卫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來归榕,“玉大人,你說我怎么就攤上這事吱涉∩残梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵怎爵,是天一觀的道長特石。 經(jīng)常有香客問我,道長鳖链,這世上最難降的妖魔是什么姆蘸? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上乞旦,老公的妹妹穿的比我還像新娘贼穆。我一直安慰自己,他們只是感情好兰粉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布故痊。 她就那樣靜靜地躺著,像睡著了一般玖姑。 火紅的嫁衣襯著肌膚如雪愕秫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天焰络,我揣著相機(jī)與錄音戴甩,去河邊找鬼。 笑死闪彼,一個胖子當(dāng)著我的面吹牛甜孤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畏腕,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缴川,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了描馅?” 一聲冷哼從身側(cè)響起把夸,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铭污,沒想到半個月后恋日,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹狞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年岂膳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磅网。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡闷营,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出知市,到底是詐尸還是另有隱情,我是刑警寧澤速蕊,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布嫂丙,位于F島的核電站,受9級特大地震影響规哲,放射性物質(zhì)發(fā)生泄漏跟啤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隅肥。 院中可真熱鬧竿奏,春花似錦、人聲如沸腥放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秃症。三九已至候址,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間种柑,已是汗流浹背岗仑。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聚请,地道東北人荠雕。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像驶赏,于是被迫代替她去往敵國和親炸卑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容