var faderTimer: NSTimer?
override func viewDidLoad() {
super.viewDidLoad()
self.faderTimer = NSTimer.scheduledTimerWithTimeInterval(self.fadeTime, target: self, selector: Selector("fadeBackground"), userInfo: nil, repeats: true)
}
我需要在控制器取消初始化之前使该计时器无效。
deinit {
//never gets called
if let timer = self.faderTimer {
self.faderTimer!.invalidate()
self.faderTimer = nil
}
}
但是,我不能将它放在 deinit() 中。看来我必须使它无效viewWillDisappear
。但是,我不想这样做,因为它会扰乱背景切换。 (从后台返回不会调用 viewWillAppear,所以我必须使用通知来启动计时器,这是一个巨大的痛苦。)我宁愿在 viewDidLoad 上启动计时器并在 deinit() 上停止它。
我宁愿启动计时器viewDidLoad
并停止它deinit()
好吧,你不能。计时器正在保留你(self
),并将继续这样做,直至其失效。这意味着除非您采取措施使其他地方的计时器无效,deinit
永远不会被称为并且视图控制器将会泄漏(它永远不会消失,它所持有的所有记忆及其所有属性都将继续保留)。你must找到另一个地方使计时器失效;就是那样子。
如果你不喜欢这样,那么不要使用 NSTimer。使用 GCD 和dispatch_source_t
反而。这样做的优点是它基于块(闭包) - 并且您可以使用weak self
or unowned self
在块内以防止自己被保留,因此您可以使计时器无效deinit
如果你想。这正是我创建一个基于GCD的定时器类 https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk1ch12p499timerLeaker2/ch12p325NotificationLeaker/CancelableTimer.swift,作为 NSTimer 的替代品。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)