首页 > 解决方案 > 线程 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 中(这是我假设的主线程,目前正在使用硬件系统,所以我不是内存专家)

这是崩溃/调试器的屏幕截图

标签: iosswiftxcodeexc-bad-access

解决方案


timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: true){(timer) in

我猜你不止一次调用startTimer()。问题是,每次调用此函数时,您都在用新的计时器对象替换正在运行的计时器对象,而无需先使其无效。您需要timer.invalidate()在创建新之前添加。

if i>4 {
     timer.invalidate()
}

这个检查永远不会是真的。每次调用此函数时,i都会重置为 1。


推荐阅读