让大家拿过来就能用且没有循环引用的定时器TFQWeakTimer

一、温故而知新:

看完自己文章《解决NSTimer循环引用导致内存泄漏的三种方法》之后有新的感悟,所以在此针对第三种方法做重点总结。 GitHub地址TFQWeakTimer

二、TFQWeakTimer使用方法

1、将TFQWeakTimer文件拖到自己项目中。

2、导入"TFQWeakTimer.h"通过initWithXXX方法创建定时器.

3、在需要销毁TFQWeakTimer或者当前类dealloc的时候调用TFQWeakTimer中的对象方法invalidateTimer销毁TFQWeakTimer

demoTFQSecondController类创建了定时器,首先可以确定的一点是,就算TFQWeakTimer不销毁,TFQSecondController也是可以销毁的。因为没有人强引用TFQSecondController。等TFQWeakTimer任务执行完以后就自己销毁了。

这中解决循环引用的方法应用到了《大话设计模式》中的代理模式,见我的另一篇文章大话设计模式,里边有23种设计模式的demo。

三、画图解释
  • 循环引用: 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一起被销毁了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值