这就是我在UIViewController
的子类中声明属性的方法:
private weak var timer: NSTimer?
这就是我在viewDidLoad()
中所做的事情:
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTimer", userInfo: nil, repeats: true)
这是我的deinit
:
deinit {
timer?.invalidate()
timer = nil
}
因为NSTimer
而未调用Deinit。不要搞笑说在NSTimer
里面有一个强烈的引用我的控制器:)我该如何解决这个问题?
答案 0 :(得分:1)
我认为@i_am_jorf给了你一个好方向。如果你看一下无效方法的the documentation,你会找到一个完整的解释,为什么它就像那样
此方法是从NSRunLoop对象中删除计时器的唯一方法。 NSRunLoop对象在invalidate方法返回之前或之后的某个时间点删除其对计时器的强引用。
如果配置了目标和用户信息对象,接收者也会删除对这些对象的强引用。
所以是的,如果在适当的时刻没有调用无效,则保留周期