__weak typeof(self) wself = self分析

首先我們要知道:在block內(nèi)部引用的對象,系統(tǒng)會自動給它的引用計數(shù)器+1;然后在block執(zhí)行完畢后粪般,才會release掉這個引用;

我們在剛學會使用block的時候匙监,在block內(nèi)部使用當前對象的屬性時小作,一般就直接引用了self關鍵字;
如果當前block的生命周期达罗,是在self這個對象的生命周期內(nèi)的,那么巡李,直接使用self是不會產(chǎn)生什么問題的扶认。

比如下面的代碼:

  obj2.block: ^ (void) {
    [self doSomethingWithObj:self.obj1];
  }

我們來分析下幾種情況:

  • 情況1:obj2 的生命周期比self要短
    也就是,obj2執(zhí)行完畢了這個block狱从,而且叠纹,obj2已經(jīng)被釋放了,self仍然存在,這時训貌,上面的代碼是沒有任何問題的冒窍。
    因為即使,在block中款慨,對self又引用計數(shù)了2次(一次self引用一次)谬莹,引用計數(shù)+2,但是當block執(zhí)行完畢后埠戳,計數(shù)器又會自動-2.

  • 情況2:obj2生命周期比self要長
    即:obj2的block還未執(zhí)行完畢蕉扮,我們的需求就要釋放掉self這個對象了喳钟。
    顯然,上面的代碼無法釋放奔则,即使在block外部易茬,self對象的引用已經(jīng)沒有對象了,但是在block中,self的引用計數(shù)仍然有2個写半,self對象是無法被釋放的尉咕。

為了解決 情況2 的需求年缎,我們要在block中訪問self弱引用,即:

__weak typeof(self) wself = self;
obj2.block: ^ (void) {
  if (wself) { // 要判斷self是否存在单芜,存在才能執(zhí)行它的方法
    [wself doSomethingWithObj:wself.obj1];
  }
}

如上面洲鸠,使用了弱引用,就不會影響我們在外部對self進行釋放了绢淀。
但是瘾腰,既然self隨時可能釋放,我們在block中如果想要使用self的方法费薄,就要先判斷self到底有沒有被釋放栖雾。

  • 情況3:對情況2的補充
    直接上代碼:

    __weak typeof(self) wself = self;
    obj2.block: ^ (void) {
      if (wself) { // 要判斷self是否存在,存在才能執(zhí)行它的方法
        [wself doSomething];
        // ... n秒后
        [wself doOtherthing];
      }
    

    }
    doSomething很可能會執(zhí)行一段時間召廷,比如n秒噪径,當然了数初,在執(zhí)行這段代碼期間泡孩,self是無法被銷毀的,即使在外部,self已經(jīng)沒有任何引用了吮播,self也要等到doSomething結束后才被銷毀变屁。

那么意狠,問題來了:既然self在執(zhí)行完doSomething后被銷毀了环戈,那么后面的doOtherthing肯定也就無法執(zhí)行了,但是我們又必須讓它執(zhí)行起來遮晚。
這個時候拦止,我們就要對__weak引用過的self再次進行__strong引用一遍。
代碼如下:

__weak typeof(self) wself = self;
obj2.block: ^ (void) {
  __strong typeof(wself) sself = wself; 
  if (sself) { // 要判斷self是否存在汹族,存在才能執(zhí)行它的方法
    [sself doSomething];
    // ... n秒后
    [sself doOtherthing];
  }
}

在block中鞠抑,再執(zhí)行一遍__strong typeof(wself) sself = wself;后,self就不會立馬被銷毀了秒梳,就可以順利執(zhí)行完畢doSomethingdoOtherthing箕速,然后在block執(zhí)行完畢后再銷毀self對象。

  • 總結
    聰明的同學看完了情況3兴垦,估計又有新的問題產(chǎn)生了:既然我要保證字柠,在block中執(zhí)行完畢doOtherthing窑业,我干嘛還要先在block外部用__weak引用一次self,然后在block內(nèi)部再次使用__strong對weakSelf引用一次常柄?
    干嘛要浪費兩步多余的引用搀擂,直接在block中使用self不就好了么?這樣即使卷玉,外部self沒有引用了哨颂,block內(nèi)部,self仍然被引用了跋嘀帧威恼?

本人水平有限,這種情況我也測試不出來寝并,希望有測試過這種情況的同學可以分享一下結果給我沃测!我將感激不盡!食茎!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂破,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子附迷,更是在濱河造成了極大的恐慌,老刑警劉巖哎媚,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇伯,死亡現(xiàn)場離奇詭異,居然都是意外死亡拨与,警方通過查閱死者的電腦和手機稻据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來买喧,“玉大人捻悯,你說我怎么就攤上這事∮倜” “怎么了今缚?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長低淡。 經(jīng)常有香客問我姓言,道長,這世上最難降的妖魔是什么蔗蹋? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任何荚,我火速辦了婚禮,結果婚禮上猪杭,老公的妹妹穿的比我還像新娘餐塘。我一直安慰自己,他們只是感情好胁孙,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布唠倦。 她就那樣靜靜地躺著,像睡著了一般涮较。 火紅的嫁衣襯著肌膚如雪稠鼻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天狂票,我揣著相機與錄音候齿,去河邊找鬼。 笑死闺属,一個胖子當著我的面吹牛慌盯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掂器,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亚皂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了国瓮?” 一聲冷哼從身側響起灭必,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乃摹,沒想到半個月后禁漓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡孵睬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年播歼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掰读。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秘狞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹈集,到底是詐尸還是另有隱情谒撼,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布雾狈,位于F島的核電站廓潜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏善榛。R本人自食惡果不足惜辩蛋,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望移盆。 院中可真熱鬧悼院,春花似錦、人聲如沸咒循。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颖医,卻和暖如春位衩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熔萧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工糖驴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佛致。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓贮缕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俺榆。 傳聞我的和親對象是個殘疾皇子感昼,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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