ios block迴圈引用問題

2021-09-06 10:30:22 字數 817 閱讀 6853

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的詳細解釋可參考 

ios block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...

ios block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...

iOS Block與迴圈引用

迴圈引用的產生 下面以arc 下為例 a 憂鬱block物件內部引用了外部的變數,而外部的變數又引用了當前的這個block,形成了彼此持有對方。如果外界不主動打斷這種鏈結,那麼就會一直持有,導致當前變數物件無法釋放。b 如果block內部沒有引用外部變數或者外部變數沒有引用block,則不會構成迴圈...