sur*_*heW 5 closures memory-leaks ios swift reference-cycle
我有一个对重复调用闭包的对象UIViewController的引用。Timer对象在其块中Timer捕获。self据我了解,这会导致retains cycle视图控制器和块之间的关系。有一个逻辑将定时器设置为nil,然后保留周期被打破,但它可能不会被执行。
我的问题如下:视图控制器将随着应用程序的存在而存在(至少在当前的实现中)。在这种情况下 - 我应该如何最好地处理这个保留周期?我应该忽略它吗,因为视图控制器无论如何都不会被释放。我应该考虑未来可能发生的变化并用unowned或weak参考文献以及哪一个来处理它。我想这应该是unowned因为计时器仅由视图控制器保留,并且一旦视图控制器被释放,它应该被释放,但不确定我是否遗漏了一些东西。先感谢您。下面的代码是我正在谈论的内容的简单示例。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")
}
}
Run Code Online (Sandbox Code Playgroud)
保留循环是两个对象相互保留引用并被保留的情况,它会创建一个循环,因为两个对象都试图相互保留。
在您的示例中,Class A通过变量拥有闭包timer。如果不声明self为weak或unowned闭包也会自己self创建一个强引用循环。
unowned和之间的区别weakunowned和之间的一个简单区别weak是 被weak声明为可选,而 as 则unowned不是。通过声明它,weak您可以处理在某个时刻它在闭包内可能为零的情况。如果你尝试访问一个unowned恰好为nil 的变量,整个程序将会崩溃。因此,仅unowned当您确信变量将始终存在且闭包存在时才使用
始终做好功能准备,因为您在任何移动应用程序中的工作都应该始终是可扩展的。
| 归档时间: |
|
| 查看次数: |
2467 次 |
| 最近记录: |