block迴圈引用問題

2021-07-05 19:24:38 字數 808 閱讀 6716

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了

這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在**了

起初的**如下:

- (void)getmyrelatedshops

failedblock:^(tmrequest *failedrequest)]; }

**表面上看起來沒有什麼問題,但是細細研究就會發現兩個問題

1、block中引用到self,self 被block retain,sendedrequest又retain了該block的一根拷貝

2.sendedrequest是在self類中定義賦值,因此是被self retain

因此就形成了迴圈引用,不會呼叫dealloc

還有乙個問題,只要重複性 timer 還沒有被 invalidated,target 物件就會被一直持有而不會被釋放。因此當你使用 self 當作 target 時,你就不能期望在 dealloc 中 invalidate timer,因為在 timer 沒有被invalidate 之前,dealloc 絕不會被呼叫。因此,需要找個合適的時機和地方來 invalidate timer,但絕不是在 dealloc 中。 

修改如下

- (void)getmyrelatedshops

failedblock:^(tmrequest *failedrequest)]; }

這樣就避免了迴圈引用,頁面登出時就會呼叫dealloc方法了

關於block的詳細解釋可參考 

Block的迴圈引用問題

預設情況下,block是存檔在棧中,可能被隨時 需要copy操作。這也就是我們在定義block的時候用得時copy。而不是weak等等。物件有乙個block屬性,然而這個block屬性中又引用了物件的其他成員變數,那麼就會對這個變數本身產生強應用,那麼變數本身和他自己的block屬性就形成了迴圈引用...

block 迴圈引用

結論 block作為成員變數,內部引用self的成員變數,必須使用self 弱引用 block作為區域性變數,無論怎樣寫,都不會對self造成強引用 block為變數 1 block為成員變數 typedef nsstring blockcc void inte ce twoviewcontroll...

block迴圈引用

底層原始碼 typedef void ghblock void struct main block impl 0 static void main block func 0 struct main block impl 0 cself static void main block copy 0 st...