ios - 线程 1:带定时器的 EXC_BAD_ACCESS
问题描述
我正在制作一个应用程序,该应用程序涉及从 4 步倒数计时器每秒/步更改 UIImageViews。当我的程序尝试在“timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: true){(timer) in if i>4”处执行计时器时,我得到一个 Thread 1: EXC_BAD_ACCESS 错误:
func startTimer(slider_Value: Float, coin: Int){
let delay = Double(slider_Value/5)
var i = 1
timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: true){(timer) in
if i>4{
timer.invalidate()
}else{
switch(i){
case 1:
self.updateImages(UIImage(named: "P1Timer1"), UIImage(named: "P2Timer1"))
case 2:
self.updateImages(UIImage(named: "P1Timer2"), UIImage(named: "P2Timer2"))
case 3:
self.updateImages(UIImage(named: "Timer3"), UIImage(named: "Timer3"))
case 4:
self.logo.image = UIImage(named: "Timer4_Logo")
default:
self.updateImages(UIImage(named: "Timer0"), UIImage(named: "Timer0"))
self.logo.image = UIImage(named: "SwipeIsh_Logo")
}
i = i+1
}
}
有人知道为什么会这样吗?看起来很奇怪,它发生在线程 1 中(这是我假设的主线程,目前正在使用硬件系统,所以我不是内存专家)
解决方案
timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: true){(timer) in
我猜你不止一次调用startTimer()。问题是,每次调用此函数时,您都在用新的计时器对象替换正在运行的计时器对象,而无需先使其无效。您需要timer.invalidate()
在创建新之前添加。
if i>4 {
timer.invalidate()
}
这个检查永远不会是真的。每次调用此函数时,i都会重置为 1。
推荐阅读
- java - openjdk-8-jre-headless:中断:ca-certificates-java (< 20160321~)
- angular - Angular FormArray 模板值未绑定到 Typescript
- rust - Rust 函数返回通用特征
- arrays - 从嵌套数组中检索数据
- javascript - 有没有办法使用 Javascript 代码自动切换浏览器字体设置?
- python - 使用字典映射选择性地更新数据框列
- sql - 需要为 ID 、 ID2、 ID3、 ID4 以 'BB%'、'ZZ%' 开头的所有列显示某些值
- python - 将元组列表和常规列表组合到字典中,然后按元组的唯一值求和
- elixir - 仅当存在参数时,如何在 ecto 中定义连接?
- sql - 如何内部连接字段的子集,为两种情况分配值并转储其余情况