@weakify-@strongify宏定義解釋

當self強引用了block時,再在block中調用self會引發(fā)循環(huán)引用問題。所以拨黔,為了避免這種情況好乐,都會使用weak-strong來解除循環(huán)引用問題匾竿。

如下所示

__weak typeof(self) weak_self = self;

a_block = ^{
    __strong typeof(weak_self) strong_self = weak_self;
    strong_self.view = ...
};
代碼解釋

weak變量weak_selfself指向相同地址

在block中調用weak_self則不會導致循環(huán)引用。因為weak_self是weak修飾蔚万,所以不會增加self的引用計數(shù)岭妖。只有selfblock的單向引用。

將weak變量轉為strong變量則是為了在block執(zhí)行期間不會被釋放反璃。因為weak變量不會影響對象的引用計數(shù)昵慌,對象可以正常釋放,當對象釋放之后該指針就變?yōu)閚il淮蜈。而將weak變量轉為strong變量斋攀,則strong變量會持有該對象,所以在block執(zhí)行期間梧田,這個對象不會被釋放淳蔼,當block執(zhí)行完畢之后,strong變量被銷毀裁眯,該對象的持有減少肖方。正常釋放。

問題

這樣的寫法需要在所有block的地方添加這兩行代碼

__weak typeof(self) weak_self = self;

__strong typeof(weak_self) strong_self = weak_self;

優(yōu)雅的寫法

定義一個宏定義

#ifndef weakify
    #if DEBUG
        #if __has_feature(objc_arc)
            #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
        #else
            #define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
        #endif
    #else
        #if __has_feature(objc_arc)
            #define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;
        #else
            #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;
        #endif
    #endif
#endif


#ifndef strongify
    #if DEBUG
        #if __has_feature(objc_arc)
            #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
        #else
            #define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;
        #endif
    #else
        #if __has_feature(objc_arc)
            #define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;
        #else
            #define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;
        #endif
    #endif
#endif

當使用的時候

@weakify(self)

blcok = ^{
    @strongify(self)
    self.view = ...
}

代碼解釋

首先看這個宏定義

這個宏定義關鍵的是在于這個

#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;

autoreleasepool{} 這個是沒有實質作用的未状,只是為了當使用這個宏的時候再宏開頭可以添加一個@符號俯画,讓使用方式更像其他語言的語法糖一樣。

然后是__weak __typeof__(object) weak##_##object = object , 后面部分中##是用于連接的

weak##_解析之后就是 weak_,然后再與##object連接司草,所以最終就是weak_object,object是宏中傳遞進來的參數(shù)艰垂。

所以當使用這個宏的時候

@weakify(self) 

其實就轉換成了

__weak __typeof__(self) weak_self = self;

所以調用的時候應該是調用weak_self

然后來看這個宏

#define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;

這個宏的不同的地方是在__typeof__(object) object = weak##_##object

當我們傳入self的時候這里就變成了這樣

__typeof__(self) self = weak_self

即定義一個self變量來指向和weak_self相同的地址

所以在下面使用的self其實是自己定義的這個變量self

所以 這個兩個宏聯(lián)合起來使用的過程簡化來說

  1. self指針賦值給weak類型的weak_self變量
  2. 再將weak_self賦值給strong類型的自己定義self變量泡仗,只不過這個變量和系統(tǒng)的self指針同名。所以在使用時雖然仍然使用的是self猜憎,但已經替換為自己定義的self
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末娩怎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胰柑,更是在濱河造成了極大的恐慌截亦,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬讨,死亡現(xiàn)場離奇詭異崩瓤,居然都是意外死亡,警方通過查閱死者的電腦和手機踩官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門却桶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔗牡,你說我怎么就攤上這事颖系。” “怎么了辩越?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵嘁扼,是天一觀的道長。 經常有香客問我黔攒,道長偷拔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任亏钩,我火速辦了婚禮莲绰,結果婚禮上,老公的妹妹穿的比我還像新娘姑丑。我一直安慰自己蛤签,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布栅哀。 她就那樣靜靜地躺著震肮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪留拾。 梳的紋絲不亂的頭發(fā)上戳晌,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音痴柔,去河邊找鬼沦偎。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的豪嚎。 我是一名探鬼主播搔驼,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侈询!你這毒婦竟也來了舌涨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扔字,失蹤者是張志新(化名)和其女友劉穎囊嘉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體革为,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡扭粱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篷角。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焊刹。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡系任,死狀恐怖恳蹲,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情俩滥,我是刑警寧澤嘉蕾,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站霜旧,受9級特大地震影響错忱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜挂据,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一以清、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崎逃,春花似錦掷倔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巴柿,卻和暖如春凛虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广恢。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工凯旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓瓦阐,卻偏偏與公主長得像蜗侈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睡蟋,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容

  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,334評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,090評論 1 32
  • 1.1 局部變量 局部自動變量踏幻,在Block中可被讀取。Block定義時copy變量的值戳杀,在Block中作為常量使...
    陳雨塵閱讀 2,920評論 4 31
  • 世間的每個生命都有著自己所迷戀的事物信卡,也許大到整個宇宙隔缀,或許只是一片落葉。它傍菇,深深所吸引著我猾瘸,被那燦爛的魅...
    殘銘心閱讀 214評論 1 3
  • 我一生中從來沒見過這樣一雙粗壯結實的大腿,那一只腿的周長肯定超過了很多中國小姑娘的腰圍丢习,讓我驚嘆不已牵触。 大腿的主人...
    紐約藍藍閱讀 1,242評論 2 7