看完本身文章《解决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
一块儿被销毁了。