@weakify @strongify的實(shí)現(xiàn)(ReactiveCocoa框架)

1.自己對(duì)的評(píng)價(jià)

  • 宏是C語言系統(tǒng)中最為有趣(通常被稱為強(qiáng)大)的部分诚卸,好的宏定義可以讓代碼簡(jiǎn)潔到極致瓜富,事半功倍的效果攒霹,當(dāng)然也會(huì)帶來調(diào)試的問題。

2.@weakify @strongify的分析

  • 已經(jīng)有帖子分析過了扣泊,用自己的方式在寫一次近范,做個(gè)筆記。
  • 結(jié)尾會(huì)附上參考閱讀的帖子

3.使用Xcode顯示預(yù)處理結(jié)果(用來判斷自己的分析結(jié)果)

  1. Product > Perform Action > Preprocess "xxx.m"


    QQ20161021-0.png
  2. 在輔助編輯器(Assistant Editer)中延蟹,點(diǎn)擊preprocess


    QQ20161021-2.png
  3. 預(yù)處理后的代碼


    QQ20161021-1.png

4.只分析@weakify评矩,@strongify是一樣的

4.1列出會(huì)分析到的所有宏
  1. @關(guān)鍵字后面weakify的定義
#define weakify(...) \
  rac_keywordify \
  metamacro_foreach_cxt(rac_weakify_,, __weak, __VA_ARGS__)
  1. rac_keywordify,就是autoreleasepool {}
  • 通過一個(gè)未使用的autoreleasepool {}阱飘,巧妙的為weakify添加@關(guān)鍵字
#if DEBUG
#define rac_keywordify autoreleasepool {}
#else
#define rac_keywordify try {} @catch (...) {}
#endif
  1. metamacro_foreach_cxt斥杜,weakify的實(shí)現(xiàn)
#define metamacro_foreach_cxt(MACRO, SEP, CONTEXT, ...) \
      metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__)
  1. metamacro_argcount,返回傳入的可變參數(shù)個(gè)數(shù)
#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)
  1. metamacro_concat沥匈,拼接兩個(gè)參數(shù)名
  • metamacro_concat(a, _b)蔗喂,返回參數(shù)名為a_b
#define metamacro_concat(A, B) \
      metamacro_concat_(A, B)
  1. metamacro_foreach_cxt1,根據(jù)weakify(...)參數(shù)個(gè)數(shù)拼接后的宏(這里weakify(self)只有self一個(gè)參數(shù)所以為cxt1高帖,如果是兩個(gè)參數(shù)缰儿,則會(huì)對(duì)應(yīng)到metamacro_foreach_cxt2)
#define metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0)
  1. rac_weakify_,weakify(...)的真實(shí)實(shí)現(xiàn)
#define rac_weakify_(INDEX, CONTEXT, VAR) \
  CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR);
  1. 關(guān)鍵字__weak散址,使用Xcode preprocess后為attribute((objc_ownership(weak)))
__weak 預(yù)處理后對(duì)應(yīng) __attribute__((objc_ownership(weak)))
4.2一步一步展開就明白了
  1. 原始宏
@weakify(self)
  1. 展開@weakify(self)乖阵,并替換參數(shù)
  @rac_keywordify  metamacro_foreach_cxt(rac_weakify_,, __weak, self)
  1. 替換rac_keywordify
  • @autoreleasepool {}這就是為什么weakify前面可以寫@關(guān)鍵字
  @autoreleasepool {}  metamacro_foreach_cxt(rac_weakify_,, __weak, self)
  1. 替換metamacro_foreach_cxt,并替換參數(shù)
  @autoreleasepool {}  metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(self))(rac_weakify_,, __weak, self)
  1. 替換metamacro_argcount(self)预麸,因?yàn)閭魅氲闹挥衧elf一個(gè)參數(shù)瞪浸,所以實(shí)際就是1
  @autoreleasepool {}  metamacro_concat(metamacro_foreach_cxt, 1)(rac_weakify_,, __weak, self)
  1. 替換metamacro_concat拼接宏參數(shù),得到下面結(jié)果
  @autoreleasepool {}  metamacro_foreach_cxt1(rac_weakify_,, __weak, self)
  1. 替換metamacro_foreach_cxt1吏祸,并替換參數(shù)
  @autoreleasepool {}  rac_weakify_(0, __weak, self)
  1. 替換rac_weakify_对蒲,并替換參數(shù)
  @autoreleasepool {}  __weak __typeof__(self) metamacro_concat(self, _weak_) = (self);
  1. 替換metamacro_concat拼接宏參數(shù)
  @autoreleasepool {}  __weak __typeof__(self) self_weak_ = (self);
  1. 替換__weak,得到最終結(jié)果(與Xcode preprocess后結(jié)果一致)
  @autoreleasepool {} __attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);

5.參考的文章

剖析@weakify贡翘、@strongify
Reactive Cocoa中@weakify和@strongify實(shí)現(xiàn)分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹈矮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子床估,更是在濱河造成了極大的恐慌含滴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐巫,死亡現(xiàn)場(chǎng)離奇詭異谈况,居然都是意外死亡勺美,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門碑韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赡茸,“玉大人,你說我怎么就攤上這事祝闻≌嘉裕” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵联喘,是天一觀的道長(zhǎng)华蜒。 經(jīng)常有香客問我,道長(zhǎng)豁遭,這世上最難降的妖魔是什么叭喜? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蓖谢,結(jié)果婚禮上捂蕴,老公的妹妹穿的比我還像新娘。我一直安慰自己闪幽,他們只是感情好啥辨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盯腌,像睡著了一般溉知。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腕够,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天着倾,我揣著相機(jī)與錄音,去河邊找鬼燕少。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒿囤,可吹牛的內(nèi)容都是我干的客们。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼材诽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼底挫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脸侥,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤建邓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睁枕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體官边,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沸手,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了注簿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片契吉。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诡渴,靈堂內(nèi)的尸體忽然破棺而出捐晶,到底是詐尸還是另有隱情,我是刑警寧澤妄辩,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布惑灵,位于F島的核電站,受9級(jí)特大地震影響眼耀,放射性物質(zhì)發(fā)生泄漏英支。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一畔塔、第九天 我趴在偏房一處隱蔽的房頂上張望潭辈。 院中可真熱鬧,春花似錦澈吨、人聲如沸把敢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽修赞。三九已至,卻和暖如春桑阶,著一層夾襖步出監(jiān)牢的瞬間柏副,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工蚣录, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留割择,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓萎河,卻偏偏與公主長(zhǎng)得像荔泳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虐杯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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