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

MCM*_*tan 1 nstimer swift deinit

使用NSTimer之后,将永远不会调用类deinit方法。该类是用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()        
}
Run Code Online (Sandbox Code Playgroud)

我也尝试将NSTimer用作局部变量,但在该处没有成功...有人遇到此问题吗?我可以在Swift中使用一个不会导致不取消分配类的计时器吗?谢谢

gna*_*729 5

计时器对其目标(自己)有很强的参考作用。并且将目标调度到运行循环,该循环对它具有强大的引用,直到计时器无效为止。除非您使计时器无效(reloadTimer.invalidate,或者可能来自loadSecurityTradeInfo方法内部),否则该对象不会消失。

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

loadSecurityTradeInfo可能应该更改为以计时器为参数的方法,以便使其无效。