iOS 避免NSTimer循环引用的解决办法
2021-09-16 本文已影响0人
街角没有咖啡店
对于需要用到计时的场景多而且杂的时候,NSTimer 的循环引用问题不胜其烦,需要在各处地方写它的停止方法,往往搞的代码乱糟糟的。
我在开发过程中有了一个想法,就是搞一个全局的单例来持有 NSTimer ,在它的触发方法中,将持有者的 Block 进行回调,这样就一劳永逸的解决了它的循环引用问题。
由此便一发不可收拾,目前在该项目中本着使用简单、节省资源的原则下,新增了许多新特性,推荐各位一用,觉得好的话还请多多点赞关注,谢谢~
话不多说,上地址:
JLTimer介绍
一款基于 NSTimer 、好用高效的计时器
-
采用单例持有 NStimer 对象,通过 Block 实时回调给创建者,使控制器与其完全解耦,再也不用担心 NStimer 和持有者的循环引用问题。
-
全自动管理,计时器无业务时时自动释放,创建者无需处理后续 invalid 等操作(仅限不重复的计时类型,当 isRepeat 是 true 时,也仅需调用 stopTimer 方法停止计时即可自动释放)。
-
无论同时运行着多少计时任务,全局同一时间只有一个 NSTimer 在运行,有效节省系统资源。
-
代码风格简洁易懂,使用 Block 回调方式,无需另写触发方法。
使用说明
1.快捷创建一个只回调一次的计时器。
[[JLTimer shared] addNewTaskWithOnceTime:5 handleBlock:^{
//5秒后回调并停止计时
}];
2.快捷创建一个倒计时的计时器。
[[JLTimer shared] addCountDownTaskWithTime:3 handleBlock:^{
//每1秒回调1次,到第3秒时停止计时
}];
3.创建一个常规计时器,附带停止方法。
NSString *timerID = [[JLTimer shared] addNewTaskWithTime:1 isRepeat:true handleBlock:^{
//每1秒回调1次,一直重复,返回值为当前计时器的ID
}];
//可以在业务需要的时候调用stopTimerWithID方法停止该计时器
[[JLTimer shared] stopTimerWithID:timerID];