看完本身文章《解決NSTimer循環引用致使內存泄漏的三種方法》以後有新的感悟,因此在此針對第三種方法作重點總結。 GitHub地址TFQWeakTimergit
TFQWeakTimer
使用方法一、將TFQWeakTimer
文件拖到本身項目中。github
二、導入"TFQWeakTimer.h"
經過initWithXXX
方法建立定時器.設計模式
三、在須要銷燬TFQWeakTimer
或者當前類dealloc
的時候調用TFQWeakTimer
中的對象方法invalidateTimer
銷燬TFQWeakTimer
app
demo
中TFQSecondController
類建立了定時器,首先能夠肯定的一點是,就算TFQWeakTimer
不銷燬,TFQSecondController
也是能夠銷燬的。由於沒有人強引用TFQSecondController
。等TFQWeakTimer
任務執行完之後就本身銷燬了。oop
這中解決循環引用的方法應用到了《大話設計模式》中的代理模式,見個人另外一篇文章大話設計模式,裏邊有23種設計模式的demo。post
TFQSecondController
強引用NStimer
。NStimer
添加在runloop
上,只要NStimer
不取消對TFQSecondController
的強引用,TFQSecondController
就銷燬不了。固然了你能夠選擇在viewWillDisappear
中銷燬NStimer
。可是TFQSecondController
頁面不必定都是pop
到上一個頁面的時候纔會調用viewWillDisappear
方法,也有可能push
新頁面,也有多是進入後臺的時候調用viewWillDisappear
,這樣咱們但願從新回到定時器頁面的時候,定時任務還依舊是執行狀態。因此invalidate
放到viewWillDisappear
是不合理的,惟一合理的地方就是TFQSecondController
銷燬的時候銷燬timer
。因此若是NStimer
在頁面即將銷燬的時候任務還沒執行完的話,那麼它的的invalidate
方法只能放到TFQSecondController
的dealloc
中。圖中兩個類互相引用,彼此沒法銷燬,能銷燬的惟一辦法就是NSTimer
任務結束,再也不持有TFQSecondController
,若是任務一直循環的話當前類就沒法銷燬,形成內存泄漏。設計
TFQSecondController
是能夠隨時銷燬的,只要在TFQSecondController
的dealloc
方法中調用TFQWeakTimer
的invalidateTimer
方法,TFQWeakTimer、NSTimer
就能夠隨着TFQSecondController
一塊兒被銷燬了。