これはa question I asked a while backの次の章です。私はこの単純化されたTimerを持っています。Matt Neuburgの本のTimerオブジェクトに触発されています。この_dispatch_xref_disposeエラーは何を意味しますか?
import Foundation
import XCPlayground
class Timer {
private var queue = dispatch_queue_create("timer", nil)
private var source: dispatch_source_t!
var tick:()->() = {}
var interval:NSTimeInterval = 1
func start() {
self.stop()
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue)
dispatch_source_set_timer(source, DISPATCH_TIME_NOW, UInt64(self.interval) * 1000000000, 0)
dispatch_source_set_event_handler(source, self.tick)
dispatch_resume(self.source)
}
func stop() {
if self.source != nil {
dispatch_suspend(self.source)
}
}
}
var timer = Timer()
timer.interval = 5
timer.tick = { print("now \(NSDate())") }
timer.start()
timer.stop()
timer = Timer() // <<--BAD STUFF HAPPENS HERE
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
問題は、私が同じ変数に新しいタイマーを割り当てるポイントです。基本的な使用例は私がタイマーで済んでいるので、私はそれをやめますが、おそらく新しいものを作成して起動したいと思っています。行をマーク遊び場では、
はエラーを与える:
Execution was interrupted, reason: EXC_BAD_INSTRUCTION {code=EXC_I386_INVOP, subcode=0x0).
私はiOSアプリで同様の何かをする場合、私はのように見える例外トレースを取得:
0: _dispatch_xref_dispose
5: MyViewController.scanTimer.setter
....
それはdoesnのそれが構造体であれクラスであれ、問題ではないようです。同じことが起こります。私はdeinit
が必要かどうか疑問に思っていましたが、それを取り除くための実装が見つかりませんでした。