讓你們拿過來就能用且沒有循環引用的定時器TFQWeakTimer

1、溫故而知新:

看完本身文章《解決NSTimer循環引用致使內存泄漏的三種方法》以後有新的感悟,因此在此針對第三種方法作重點總結。 GitHub地址TFQWeakTimergit

2、TFQWeakTimer使用方法

一、將TFQWeakTimer文件拖到本身項目中。github

二、導入"TFQWeakTimer.h"經過initWithXXX方法建立定時器.設計模式

三、在須要銷燬TFQWeakTimer或者當前類dealloc的時候調用TFQWeakTimer中的對象方法invalidateTimer銷燬TFQWeakTimerapp

demoTFQSecondController類建立了定時器,首先能夠肯定的一點是,就算TFQWeakTimer不銷燬,TFQSecondController也是能夠銷燬的。由於沒有人強引用TFQSecondController。等TFQWeakTimer任務執行完之後就本身銷燬了。oop

這中解決循環引用的方法應用到了《大話設計模式》中的代理模式,見個人另外一篇文章大話設計模式,裏邊有23種設計模式的demo。post

3、畫圖解釋

  • 循環引用: TFQSecondController強引用NStimerNStimer添加在runloop上,只要NStimer不取消對TFQSecondController的強引用,TFQSecondController就銷燬不了。固然了你能夠選擇在viewWillDisappear中銷燬NStimer。可是TFQSecondController頁面不必定都是pop到上一個頁面的時候纔會調用viewWillDisappear方法,也有可能push新頁面,也有多是進入後臺的時候調用viewWillDisappear,這樣咱們但願從新回到定時器頁面的時候,定時任務還依舊是執行狀態。因此invalidate放到viewWillDisappear是不合理的,惟一合理的地方就是TFQSecondController銷燬的時候銷燬timer。因此若是NStimer在頁面即將銷燬的時候任務還沒執行完的話,那麼它的的invalidate方法只能放到TFQSecondControllerdealloc中。

圖中兩個類互相引用,彼此沒法銷燬,能銷燬的惟一辦法就是NSTimer任務結束,再也不持有TFQSecondController,若是任務一直循環的話當前類就沒法銷燬,形成內存泄漏。設計

  • 用代理模式解決循環引用:圖中已經能很是明顯的看出來TFQSecondController是能夠隨時銷燬的,只要在TFQSecondControllerdealloc方法中調用TFQWeakTimerinvalidateTimer方法,TFQWeakTimer、NSTimer就能夠隨着TFQSecondController一塊兒被銷燬了。
相關文章
相關標籤/搜索