使用NSTimer是Swift的原因' deinit'不打电话

时间:2015-06-10 13:10:03

标签: swift nstimer 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()        
}

我尝试使用NSTimer作为本地变量,但没有成功...... 有谁遇到这个问题?是否有一个我可以在Swift中使用的计时器,它不会导致该类不被释放?感谢

2 个答案:

答案 0 :(得分:5)

计时器具有对其目标(自身)的强引用。并且目标被安排到运行循环,该循环保持对它的强引用,直到计时器失效。在使计时器无效(reloadTimer.invalidate,或者可能来自loadSecurityTradeInfo方法)之前,该对象不会消失。

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

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

答案 1 :(得分:2)

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