时序图
问题描述
- 操作面板申请了一个一次性计时器OnceTimer(对应缓存别名Cache1)
,随后Timer执行完毕,此时引擎自动将该Timer回收到缓存池 - 进度条面板申请一个循环计时器LoopTimer来自动隐藏进度条(引擎查看缓存池,发现Cache1已经无用,将其拿出给了LoopTimer);(PS:位什么设计为自动,请联系作者)
- 再次打开操作面板,尝试停止已经存在的OnceTimer,但由于(OnceTimer == Cache1 == LoopTimer),实际停止了LoopTimer,至此引发血案(类似c++中野指针…)
问题分析
- 直接原因:第1步中OnceTimer应该已经失效,但第3步中却依旧能操作缓存
- 本质原因:引擎缓存回收机制有问题,对有引用的OnceTimer进行了回收
问题解决
- 最优解决方案:申请Timer时候,系统应返回一个无法直接操作缓存,但能间接查看与修改Timer状态的别名(比如一个数字,并且整个系统运行过程中不重复),而不是Cache本身,这样,就不存在不安全操作(PS:即使主动回收,也顺理成章,因为外部不存在引用
) - 次优解决方案:对使用过后的OnceTimer手动置空(但实际编码过程中依然容易出错),此时也可以考虑接口开发ref参数,由接口完成