NSTimer在解雇后挂起程序

时间:2014-11-12 15:29:14

标签: swift nstimer

我在ViewController中创建了一个计时器。在它触发一次之后,该程序将不再响应任何进一步的UI事件。

我在ViewDidLoad()内创建了计时器:

NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "initTimerFired", userInfo: nil, repeats: false)

带有计时器功能(定义为ViewController的方法):

func initTimerFired(){

    println("Timer fired")
}

它成功触发,但此后程序挂起并且不响应UI事件。如果我设置repeat = true,那么在退出EXC_BAD_ACCESS之前它会运行几次。

我看了很多不同的答案和例子,我看不出自己做错了什么。

我在iOS模拟器上使用xcode 6.1运行它。

这是一个更新。感谢第一个答案中提供的建议和代码,我有一些工作。但是,我看起来相同的代码不起作用。为了在更大的项目的上下文中实现事物,我想知道如何避免我看到的错误。例如,这有效:

class ViewController: UIViewController {

    @IBOutlet weak var strConsole: UILabel!
    override func viewDidLoad() {

        super.viewDidLoad()
        initTaskManager()

    }

    func initTaskManager(){
        let taskManager = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "updateTask", userInfo: nil, repeats: true)
    }

    func updateTask(){

        self.strConsole.text = "\(strConsole.text!)Abc"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

但是这个版本没有。只有功能名称已更改!:

class ViewController: UIViewController {

    @IBOutlet weak var strConsole: UILabel!
    override func viewDidLoad() {

        super.viewDidLoad()
        initTimer()

    }

    func initTimer(){
        let timer1 = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "initTimerFired", userInfo: nil, repeats: true)
    }

    func initTimerFired(){

        self.strConsole.text = "\(strConsole.text!)Abc"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

2 个答案:

答案 0 :(得分:3)

不要使用:initTimerFired,更改为其他内容,例如:handleTimer,

init作为函数名的前缀可能会混淆Xcode

见这里: https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithObjective-CAPIs.html

答案 1 :(得分:1)

你必须这样做:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var strConsole: UILabel!

    func startTaskManager(){

        let taskManager = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTask", userInfo: nil, repeats: true)

    }
    func updateTask(){

        self.strConsole.text = "\(strConsole.text!)Abc"
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        startTaskManager()

     }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }


}