Это следующая глава от a question I asked a while back. У меня есть этот упрощенный таймер, он вдохновлен объектом 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
....
Это Безразлично Кажется, это имеет значение, если это структура или класс. То же самое происходит. Я задавался вопросом, нужен ли мне deinit
, но я не нашел реализации этого, что заставляет его уйти.