block與weakSelf缸逃、strongSelf

前言
這篇文章僅僅回答weakSelf少辣、stongSelf是如何做到避免循環(huán)引用也延長執(zhí)行生命周期的。
這個小技巧可能都被iOS工程師們用到滾瓜熟爛了笤成,但同時也很可能有人還不知道原理的评架,所以小智就在這簡單介紹一下!

避免循環(huán)引用炕泳?
全世界都知道block會自動強引用里面調用的實例變量纵诞,SO,一旦block里面所直接引用了self就會引發(fā)循環(huán)引用培遵,為啥呢浙芙?


8306E75F-B76D-404D-A84C-7DF15C772385.png

如上圖所示是一個直接強引用的示例圖。OK籽腕,假設這時self想要釋放自己茁裙,它的引用計數(shù)器必須清零,然后執(zhí)行dealloc去釋放掉它持有的屬性與實例變量节仿。
只是是不是看出點端倪來了晤锥。對了block是在dealloc的過程中執(zhí)行的,在ARC環(huán)境下把這些代碼都隱藏自動執(zhí)行了廊宪。SO矾瘾,因為block的強引用self,那么self的計數(shù)器就不會清零箭启,就不會執(zhí)行dealloc壕翩,不會執(zhí)行dealloc,那么block的釋放操作也不會執(zhí)行傅寡,就形成了循環(huán)引用放妈,造成self和block都不會被釋放掉,內存泄漏荐操。

那么引用引用了weakSelf呢芜抒?哈哈,如下圖所示:


99C12EB6-2DD5-4D42-B3DD-8EE08350A222.png

我們繼續(xù)從引入計數(shù)來分析這個問題托启。block引用了weakSelf宅倒,因為是weakSelf所以self的引用計數(shù)器完全不受block的影響。所以self在執(zhí)行dealloc是愛咋地就咋地屯耸,只要count清零拐迁,就立即執(zhí)行蹭劈,還順便釋放掉block,所以weakSelf是能讓實現(xiàn)避免循環(huán)引用的問題线召。

延長執(zhí)行生命周期铺韧?

好像有weakSelf就能解決block的所有問題,這延長執(zhí)行生命周期有是什么鬼缓淹?
好的哈打,我們又來假設一種新的情況,假如你的block是個網絡請求回調割卖,而且這個回調是在非主線程異步執(zhí)行前酿,那么如果這時的self的count清零了绽慈,block中的回調都還未執(zhí)行完就被清零了傻咖,這有時還是會影響業(yè)務邏輯的系冗,要解決這個問題就需要引用strongSelf了,如下圖所示:


375E678E-3C27-4F30-8422-F0E22F77C53C.png

細心的大家會發(fā)現(xiàn)stringSelf變藍了丙挽,為什么不是變黃呢?那時因為紅色代表block外部定義的屬性變量匀借,而藍色表示是block中自己定義的局部變量颜阐。來到這里只要理清兩個概念,即可解開這個謎題吓肋,

  • 一個指針對另外一個指針賦值,被賦值的指針實際上就是得到指向對象的地址
  • 方法函數(shù)中的局部變量是存儲在棧內存區(qū)的是鬼,所以一旦方法函數(shù)執(zhí)行完,那么局部變量就會被釋放掉均蜜。

根據以上兩點得出上圖的簡略圖:


9BC85982-0F7A-4CB1-AC97-DB3652F37DB7.png

首先block只是在block只引用了weakSelf,所以不會引起循環(huán)引用。其次囤耳,每當block在執(zhí)行的時候篙顺,因為它的局部變量間接強引用self,所以self的count不會清零而執(zhí)行dealloc充择,確保了block能執(zhí)行完成,一旦block執(zhí)行完成椎麦,self又具備執(zhí)行dealloc的權利,那么就能安全釋放铃剔。

總結:
根據上文的原理闡述撒桨,發(fā)現(xiàn)通過weakSelf與strongSelf搭配使用查刻,能決定一個block是否需要延長生命周期確保執(zhí)行完畢。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末凤类,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谜疤,更是在濱河造成了極大的恐慌,老刑警劉巖夷磕,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尺棋,居然都是意外死亡,警方通過查閱死者的電腦和手機膘螟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門碾局,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荆残,“玉大人净当,你說我怎么就攤上這事∠裉洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵备徐,是天一觀的道長。 經常有香客問我蜜猾,道長,這世上最難降的妖魔是什么蹭睡? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任赶么,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘清钥。我一直安慰自己,他們只是感情好祟昭,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布篡悟。 她就那樣靜靜地躺著谜叹,像睡著了一般搬葬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上急凰,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音香府,去河邊找鬼董栽。 笑死码倦,一個胖子當著我的面吹牛企孩,可吹牛的內容都是我干的。 我是一名探鬼主播袁稽,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼推汽!你這毒婦竟也來了?” 一聲冷哼從身側響起莲组,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤暖夭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迈着,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡裕菠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旧烧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡掘剪,死狀恐怖,靈堂內的尸體忽然破棺而出肆汹,到底是詐尸還是另有隱情,我是刑警寧澤昂勉,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布扫腺,位于F島的核電站,受9級特大地震影響笆环,放射性物質發(fā)生泄漏。R本人自食惡果不足惜躁劣,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望志膀。 院中可真熱鬧,春花似錦溉浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吓妆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間行拢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工竭缝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留房维,地道東北人抬纸。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像湿故,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坛猪,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容