[英]weak variable with a strong reference in a block: does not create a retain cycle?
[英]Strong, weak or unowned in reference cycle with Timer
我有一个UIViewController
,它引用了一个重复调用闭包的Timer
对象。 Timer
对象在其块中捕获self
。 据我了解,这会导致视图控制器和块之间的retains cycle
。 有一个逻辑是把timer设置为nil然后retain cycle被打破,但是不一定会执行。
我的问题如下:只要应用程序存在,视图控制器就会存在(至少在当前实现中)。 在这种情况下——我应该如何最好地处理这个保留周期? 我是否应该忽略它,因为 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")
}
}
在你的情况下weak
和unowned
是可以接受的。 在计时器块内使用简单代码,我建议使用weak
,否则,您可以更喜欢unowned
。 使用weak
来关注项目的未来更新和扩展。
timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: {[weak self] (theTimer) in
self?.varToReference += 1
})
保留循环是当两个对象保持对彼此的引用并被保留时的条件,它会创建一个循环,因为两个对象都试图相互保留。
在您的示例中, Class A
通过timer
变量拥有闭包。 如果您不将self
声明为weak
或unowned
,则闭包也会拥有self
,从而创建一个强引用循环。
unowned
weak
的区别 unowned
和weak
之间的一个简单区别是weak
被声明为可选的,而 as unowned
则不是。 通过声明它weak
你可以处理它在某些时候可能在闭包内为nil的情况。 如果你试图访问一个恰好为nil的unowned
变量,它会导致整个程序崩溃。 因此,仅当您确定变量在闭包周围时始终存在时才使用unowned
始终准备好功能,因为您在任何移动应用程序中的工作都应该始终是可扩展的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.