什么時(shí)候在 block 中不需要使用 weakSelf --轉(zhuǎn)自唐巧

問(wèn)題

我們知道,在使用 block 的時(shí)候,為了避免產(chǎn)生循環(huán)引用,通常需要使用 weakSelf 與 strongSelf,寫下面這樣的代碼:

__weaktypeof(self) weakSelf = self;

[self doSomeBlockJob:^{

? ? __strong typeof(weakSelf) strongSelf = weakSelf;

? ? if (strongSelf) {

? ? ? ? ...

? ? }

}];

那么請(qǐng)問(wèn):什么時(shí)候在 block 里面用 self,不需要使用 weak self?

答案

當(dāng) block 本身不被 self 持有,而被別的對(duì)象持有,同時(shí)不產(chǎn)生循環(huán)引用的時(shí)候,就不需要使用 weak self 了。最常見(jiàn)的代碼就是 UIView 的動(dòng)畫代碼,我們?cè)谑褂?UIView 的?animateWithDuration:animations?方法 做動(dòng)畫的時(shí)候,并不需要使用 weak self,因?yàn)橐贸钟嘘P(guān)系是:

UIView 的某個(gè)負(fù)責(zé)動(dòng)畫的對(duì)象持有了 block

block 持有了 self

因?yàn)?self 并不持有 block,所以就沒(méi)有循環(huán)引用產(chǎn)生,因?yàn)榫筒恍枰褂?weak self 了。

[UIView animateWithDuration:0.2animations:^{

? ? self.alpha =1;

}];


當(dāng)動(dòng)畫結(jié)束時(shí),UIView 會(huì)結(jié)束持有這個(gè) block,如果沒(méi)有別的對(duì)象持有 block 的話,block 對(duì)象就會(huì)釋放掉,從而 block 會(huì)釋放掉對(duì)于 self 的持有。整個(gè)內(nèi)存引用關(guān)系被解除。

思考題

如果覺(jué)得上面的問(wèn)題太簡(jiǎn)單,可以想想下面兩個(gè)題目:

為什么 block 里面還需要寫一個(gè) strong self,如果不寫會(huì)怎么樣?

有沒(méi)有這樣一個(gè)需求場(chǎng)景,block會(huì)產(chǎn)生循環(huán)引用,但是業(yè)務(wù)又需要你不能使用 weak self? 如果有,請(qǐng)舉一個(gè)例子并且解釋這種情況下如何解決循環(huán)引用問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容