1

使用 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 中使用不会导致类不被释放的计时器吗?谢谢

4

2 回答 2

5

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

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

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

于 2015-06-10T13:15:25.020 回答
2

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

于 2015-06-10T13:14:52.617 回答