NSTimer使用分类避免循环引用

     定时器 ,我们开发中用的很多,NSTimer一不小心很容易造成循环引用,引起内存泄漏,于是写了个分类,使用很简单,只管创建,不用调用invalidate停止定时器(当然如果需要要的话,当然可以手动调用),代码如下:

NSTimer使用分类避免循环引用_第1张图片
NSTimer分类头文件

      其中还定义了TimerTarget类,这个类的实例作为NSTimer的target,也就是说定时器触发了TimerTarget的方法,这就避免了控制器(或者其他)和NSTimer 的循环引用。

 分类实现如下:

NSTimer使用分类避免循环引用_第2张图片
NSTimer分类实现

      通过代码我们可以看到参数中有个existObj的对象(一般传控制器),这个参数主要用于判断移除定时器的时机,existOjb使用了weak修饰,weak有个特性:他不会是引用计数加一,当所指向的对象消亡时,会自动值为nil,正是通过这一点判断需要移除定时器,比如我么退出当前页面,也就是当前控制器消亡,这个时候会移除定时器。

TimerTarget的实现:

NSTimer使用分类避免循环引用_第3张图片
TimerTarget实现

     可以看出每次定时器触发事件时,先判断existObj对象是否还存在,如何存在正常回调,如何不存在,这个时候定时器也没有存在的意义,此时,移除定时器。

使用简单:

NSTimer使用分类避免循环引用_第4张图片
使用

运行结果:

NSTimer使用分类避免循环引用_第5张图片

   当退出当前控制器,ViewController dealloc打印了,说明没有内存泄漏,同时timeUserInfo:test信息不再打印,定时器也自动移除了,达到了要的效果。

   总结:这里主要有两点,1使用内部类避免控制器与定时器耦合在一起 2巧用weak的特性判断对象消亡时机。

你可能感兴趣的:(NSTimer使用分类避免循环引用)