RAC 宏學(xué)習(xí)

1.動態(tài)參數(shù)個(gè)數(shù)的計(jì)算

metamacro_argcount(...)

這個(gè)宏是用來計(jì)算參數(shù)個(gè)數(shù)的,其實(shí)就是根據(jù)__VA_ARGS__可變原則,以及參數(shù)占位原則來實(shí)現(xiàn)的

#define diy_argcount(...)

定義了上面這個(gè)宏,里面的...就是__VA_ARGS__,如果寫成

diy_argcount(1,2,3)

那么__VA_ARGS__就是1,2,3,稍微變化一下

#define diy_argcount_1(parm1,...)
#define diy_argcount(...) diy_argcount_1(__VA_ARGS__)

此時(shí)上面的diy_argcount_1__VA_ARGS__就變成2,3, parm1就變成了1,再來看看metamacro_argcount

#define metamacro_argcount(...) \
        metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

#define metamacro_at(N, ...) \
        metamacro_concat(metamacro_at, N)(__VA_ARGS__)

假設(shè)我們代碼是metamacro_argcount(obj1,obj2,obj3)那么根據(jù)上面的宏變換下,就是

metamacro_at20(obj1,obj2,obj3,20,19,....2,1)

#define metamacro_at20(_0, _1, _2, _3, _4, _5, _6, 
_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) 
metamacro_head(__VA_ARGS__)

metamacro_at20(obj1,obj2,obj3,20,19,....2,1)中前面的20個(gè)參數(shù)逐個(gè)應(yīng)對_1,_2,_3...._20這樣的變量,也及時(shí)相當(dāng)于

_0  = obj1,
_1  = obj2,
_2  = obj3,
_3 = 20,
_4 = 19
.
.
.
_19 = 4

這樣metamacro_head(__VA_ARGS__)中的__VA_ARGS__就是3,2,1
metamacro_head定義如下

#define metamacro_head_(FIRST, ...) FIRST

那么metamacro_head_ (3,2,1)就是3也就是有三個(gè)參數(shù)的輸入

2.@weakify(obj1,obj2,obj3)實(shí)現(xiàn)

如果weakify只可以接受一個(gè)參數(shù),這樣的宏都會寫

#define weakify(_1)   __weak __typeof__(_1)  _1##_weak_ = (_1)

我們可以通過動態(tài)獲取參數(shù)個(gè)數(shù)的方法,拿到obj1, obj2, obj3,再對他們每個(gè)rac_weakify_
簡化下RAC以后的宏定義

#define rac_weakify_(VAR) \
    __weak __typeof__(VAR)   VAR##_weak_ = (VAR);

定義

#define rac_weakify_20(N,SEP,...)  rac_weakify_(N)\
SEP\
rac_weakify_19(__VA_ARGS__)

#define rac_weakify_19(N,SEP,...)  rac_weakify_(N)\
SEP\
rac_weakify_18(__VA_ARGS__)
.
.
.
#define rac_weakify_1(N)  rac_weakify_(N)

那么weakify宏就可以寫成

#define weakify(...)  (rac_weakify_##metamacro_argcount(__VA_ARGS__))(__VA_ARGS__)

而RAC為了區(qū)分在這類的宏在前面加個(gè)@,其實(shí)就是

#define weakify(...)  autoreleasePool{}  (rac_weakify_##metamacro_argcount(__VA_ARGS__))(__VA_ARGS__)

其中SEP就是宏定義空字符,用來分開宏定義字符連接

關(guān)鍵點(diǎn)

假設(shè)定義#define macro1 左(...) 右(__VA_ARGS__)
關(guān)鍵點(diǎn):宏中的...=> __VA_ARGS__從左到右是全映射
而宏中右部分的__VA_ARGS__映射到另一個(gè)宏時(shí),是逐個(gè)映射到變量,只有映射不到的時(shí)候,或者有剩余沒有映射到的參數(shù)才映射到...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市且蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖钧敞,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伐脖,居然都是意外死亡介粘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門蛉谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚晚,“玉大人,你說我怎么就攤上這事型诚】脱啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵狰贯,是天一觀的道長也搓。 經(jīng)常有香客問我,道長涵紊,這世上最難降的妖魔是什么傍妒? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮摸柄,結(jié)果婚禮上颤练,老公的妹妹穿的比我還像新娘。我一直安慰自己驱负,他們只是感情好嗦玖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布患雇。 她就那樣靜靜地躺著,像睡著了一般宇挫。 火紅的嫁衣襯著肌膚如雪庆亡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天捞稿,我揣著相機(jī)與錄音又谋,去河邊找鬼。 笑死娱局,一個(gè)胖子當(dāng)著我的面吹牛彰亥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衰齐,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼任斋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耻涛?” 一聲冷哼從身側(cè)響起废酷,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抹缕,沒想到半個(gè)月后澈蟆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卓研,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年趴俘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏赘。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寥闪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磨淌,到底是詐尸還是另有隱情疲憋,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布梁只,位于F島的核電站缚柳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敛纲。R本人自食惡果不足惜喂击,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淤翔。 院中可真熱鬧翰绊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至裁奇,卻和暖如春桐猬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刽肠。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工溃肪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音五。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓惫撰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躺涝。 傳聞我的和親對象是個(gè)殘疾皇子厨钻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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