我有一个UIViewController
,它具有对Timer
对象的引用,该对象正在反复调用闭包。 Timer
对象在其块中捕获self
。据我了解,这导致视图控制器和块之间的retains cycle
。有一种逻辑可以将计时器设置为nil,然后中断保留周期,但是可能无法执行。
我的问题是:View Controller的寿命将与应用程序的寿命一样长(至少在当前实施中)。在这种情况下-我应该如何最好地照顾这个保留周期?我应该忽略它吗,因为无论如何都不会释放View控制器。我应该考虑将来可能发生的更改,并使用unowned
或weak
引用以及哪个引用来处理。我猜应该是unowned
,因为计时器仅由View Controller保留,并且应该在View Controller释放后才释放,但不确定是否丢失了某些东西。先感谢您。以下代码是我正在谈论的简单示例。 Class A
是视图控制器。
class A {
var timer: Timer? = nil
var varToReference: Int = 0
func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: { (theTimer) in
self.varToReference += 1
})
}
func stopTimer() {
if let theTimer = timer {
theTimer.invalidate()
timer = nil
}
}
func onAdapterStarts() {
self.startTimer()
}
func onAdapterStops(){
self.stopTimer()
}
deinit {
print("A Deinit")
}
}
最佳答案
保留周期是两个对象相互引用并被保留时的条件,由于两个对象都试图相互保留,因此它会创建一个循环。
现在让我们来看一下示例代码
在您的示例中,Class A
通过timer
变量拥有闭包。如果不将self
声明为weak
或unowned
,则闭包也将拥有self
,从而创建一个强大的参考周期。unowned
和weak
之间的区别unowned
和weak
之间的一个简单区别是weak
被声明为可选,而unowned
则不是。通过将其声明为weak
,您可以处理某些情况下在闭包内部可能为 nil 的情况。如果您尝试访问碰巧是 nil 的unowned
变量,它将崩溃整个应用程序。因此,仅当您肯定变量在闭包周围始终存在时才使用unowned
随时准备好功能,因为您在任何移动应用程序中的工作都应始终
可扩展。
See this accepted answer for better understanding.
关于ios - 计时器在引用周期中处于强,弱或无状态状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55845727/