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退出。

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

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

这是最新消息。多亏了第一个答案中提供的建议和代码,我有了一些工作。然而,我的代码看起来是一样的,却不起作用。为了在一个更大的项目中实现,我想知道如何避免我看到的错误。例如,这是有效的:

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()
    }

}

不要使用:initTimerFired,改为其他类似:handleTimer,

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

请参见此处:https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithObjective-CAPIs.html

你必须这样做:

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()
    }

}

最新更新