使用 NSTimer 是 Swift 导致 'deinit' 不调用

Using NSTimer is Swift causes 'deinit' not to call

使用 NSTimer 后,class deinit 方法不再被调用。 class 写在 Swift,我在 "init" 调用定时器,如下所示:

init(eventsDistributor : EventsDistributor, orderSide : ORDER_SIDE, stockViewModel : StockViewModel, orderType : ORDER_TYPE_ENUM, orderPrice : NSNumber) {
    self.eventsDistributor = eventsDistributor
    self.orderSide = orderSide
    self.stockViewModel = stockViewModel
    self.orderType = orderType
    self.orderPrice = orderPrice
    super.init()
    _events()
    loadPreOrderDetails()

    //Here I call the Timer:
    var reloadTimer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "loadSecurityTradeInfo", userInfo: nil, repeats: true)
    reloadTimer.fire()        
}

我也尝试使用 NSTimer 作为局部变量,但没有成功... 有人面临这个问题吗?有没有我可以在 Swift 中使用的计时器,它不会导致 class 不被释放?谢谢

NSTimer 保留其目标。没有惊喜。您需要先使定时器失效

计时器对其目标(自身)有很强的引用。并且目标被调度到 运行 循环,它持有对它的强引用,直到计时器失效。直到您使计时器无效(reloadTimer.invalidate,或者可能在 loadSecurityTradeInfo 方法中),对象才会消失。

这实际上非常好,因为在对象消失后计时器向对象发送 loadSecurityTradeInfo 消息将是一个非常非常糟糕的主意。

loadSecurityTradeInfo 可能应该更改为将计时器作为参数的方法,这样它就可以使其无效。