iOS block中weakSelf和strongSelf的使用(分別什么時(shí)候用)

一 :前言

在Block 的使用中 為了避免循環(huán)引用 我們經(jīng)常把 ‘self’ 轉(zhuǎn)換成 weak automatic 的變量 這樣在 Block 中就不會(huì)出現(xiàn)對(duì) self 的強(qiáng)引用。代碼示意 如下所示:

__weak __typeof__(self) weakSelf = self;? ? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

[weakSelf doMethod];

});

但是 在 AFNetworking 的有如下代碼创译。 這里 Matte 使用了 strongSelf 修飾。

__weak__typeof(self)weakSelf =self;

AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {

__strong__typeof(weakSelf)strongSelf = weakSelf;

strongSelf.networkReachabilityStatus= status;if(strongSelf.networkReachabilityStatusBlock) {

strongSelf.networkReachabilityStatusBlock(status);

}

};

在 博客 中 我們講到三種 解決循環(huán)引用的方法哮幢。其實(shí)在 也是可以使用 StrongSelf 的。那么 在什么情況下使用 strongSelf

什么情況下使用weakSelf 呢宵蛀??

在博客??https://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/?中講到

__weak __typeof__(self) weakSelf = self;

dispatch_group_async(_operationsGroup, _operationsQueue, ^

{

[weakSelf doSomething];

[weakSelf doSomethingElse];

} );


Well, in this case, its possible for ‘weakSelf’ to be non-nil for the first method, but not for the second. Hmmm – the above is a simple example, most real code would get much more complex with other usages of ‘weakSelf’.

也就是 在實(shí)際調(diào)用過程中 weakSelf 在執(zhí)行完?doSomething 方法后 可能? 會(huì)變成nil? 钝的。 下面我們使用代碼 來(lái)演示 其中的一種情形及塘。 如果你 發(fā)現(xiàn)了其他的情形 歡迎聯(lián)系我。?

二 : 代碼演示

下載 代碼DEMO?https://github.com/LoveHouLinLi/iOS_Block? ?绵跷。

ViewController 中 方法??doSomething? 是一個(gè) 耗時(shí)大約 5s 的操作?

- (void)doSomething

{

// 耗時(shí)的操作

doublesum =0.0;

for(inti =0; i<1000; i++) {

for(intj =0; j<1000; j++) {

sum+=i;

sum+=j;

for(intm =0; m<1000; m++) {

sum+=m;

}

}

}

}


方法? ?- (void)doOtherSomething? 也是一個(gè)耗時(shí)大約 5s的 方法膘螟。

按鈕 操作如下?

/**

反復(fù)的調(diào)用 testWeakSelf

@param sender sender description

*/

- (IBAction)blockTestThree:(id)sender

{

[selftestWeakSelfNilFailure];

}

- (IBAction)setWeakSelfNil:(id)sender

{

//weakSelf = nil;

//self = nil;

//

}

- (IBAction)strongSelf:(id)sender

{

[selftestStrongSelfInBlock];

}


從 RootViewController? 點(diǎn)擊next 進(jìn)入ViewController? ,點(diǎn)擊按鈕?testWeakSelfNilFailure 等3s? 在?doSomething 執(zhí)行完之前 點(diǎn)擊 左上角返回按鈕碾局。 這是打印

2017-12-11 18:33:21.168596+0800 Block_Recycle[21357:5594567] do somthing end

2017-12-11 18:33:21.168698+0800 Block_Recycle[21357:5594567] weakSelf is (null)

2017-12-11 18:33:21.168729+0800 Block_Recycle[21357:5594476] view controll dealloc

再 從 RootViewController? 點(diǎn)擊next 進(jìn)入ViewController? 荆残,點(diǎn)擊按鈕strongSelf 等3s? 在doSomething 執(zhí)行完之前 點(diǎn)擊 左上角返回按鈕。 這是打印

2017-12-11 18:33:33.128204+0800 Block_Recycle[21357:5594566] do somthing end

2017-12-11 18:33:33.128276+0800 Block_Recycle[21357:5594566] do other something start

2017-12-11 18:33:39.753628+0800 Block_Recycle[21357:5594566] do other thing end

2017-12-11 18:33:39.753759+0800 Block_Recycle[21357:5594476] view controll dealloc


對(duì)比發(fā)現(xiàn) 使用weakSelf 的場(chǎng)景 沒有執(zhí)行 完?doOtherSomething 方法里面的代碼 就 dealloc 了 而 使用 strongSelf 的場(chǎng)景一直 等到??doOtherSomething 執(zhí)行完之后 才?dealloc >坏薄D谒埂!像啼!?

實(shí)際開發(fā)過程中 我們 盡量使用 StrongSelf? 因?yàn)槲覀儾恢?合作coder 啥時(shí)候 釋放了 self 造成 代碼沒執(zhí)行完就 被設(shè)置為 nil 的 問題俘闯。 代碼 和 解決 Block 循環(huán)引用一起 注意區(qū)分。


三:參考博客

http://www.reibang.com/p/36342264d6df

https://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忽冻,一起剝皮案震驚了整個(gè)濱河市真朗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僧诚,老刑警劉巖蜜猾,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異振诬,居然都是意外死亡蹭睡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門赶么,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肩豁,“玉大人,你說(shuō)我怎么就攤上這事∏逶浚” “怎么了琼锋?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祟昭。 經(jīng)常有香客問我缕坎,道長(zhǎng),這世上最難降的妖魔是什么篡悟? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任谜叹,我火速辦了婚禮,結(jié)果婚禮上搬葬,老公的妹妹穿的比我還像新娘荷腊。我一直安慰自己,他們只是感情好急凰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布女仰。 她就那樣靜靜地躺著,像睡著了一般抡锈。 火紅的嫁衣襯著肌膚如雪疾忍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天床三,我揣著相機(jī)與錄音一罩,去河邊找鬼。 笑死勿璃,一個(gè)胖子當(dāng)著我的面吹牛擒抛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播补疑,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歧沪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了莲组?” 一聲冷哼從身側(cè)響起诊胞,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锹杈,沒想到半個(gè)月后撵孤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竭望,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年邪码,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咬清。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闭专,死狀恐怖奴潘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情影钉,我是刑警寧澤画髓,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站平委,受9級(jí)特大地震影響奈虾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廉赔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一肉微、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昂勉,春花似錦浪册、人聲如沸扫腺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笆环。三九已至攒至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躁劣,已是汗流浹背迫吐。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留账忘,地道東北人志膀。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鳖擒,于是被迫代替她去往敵國(guó)和親溉浙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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