让你们拿过来就能用且没有循环引用的定时器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一块儿被销毁了。
相关文章
相关标签/搜索