代理模式管理NSTimer解决循环引用

一、温故而知新:

看完自己文章《解决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一起被销毁了。

猜你喜欢

转载自juejin.im/post/5b4824f06fb9a04fbf26fed2