使用计时器的引用循环中的强、弱或无主

sur*_*heW 5 closures memory-leaks ios swift reference-cycle

我有一个对重复调用闭包的对象UIViewController的引用。Timer对象在其块中Timer捕获。self据我了解,这会导致retains cycle视图控制器和块之间的关系。有一个逻辑将定时器设置为nil,然后保留周期被打破,但它可能不会被执行。

我的问题如下:视图控制器将随着应用程序的存在而存在(至少在当前的实现中)。在这种情况下 - 我应该如何最好地处理这个保留周期?我应该忽略它吗,因为视图控制器无论如何都不会被释放。我应该考虑未来可能发生的变化并用unownedweak参考文献以及哪一个来处理它。我想这应该是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)

Vij*_*avi 2

保留循环是两个对象相互保留引用并被保留的情况,它会创建一个循环,因为两个对象都试图相互保留。

现在让我们来看一下您的示例代码

在您的示例中,Class A通过变量拥有闭包timer。如果不声明selfweakunowned闭包也会自己self创建一个强引用循环。

unowned和之间的区别weak

unowned和之间的一个简单区别weak是 被weak声明为可选,而 as 则unowned不是。通过声明它,weak您可以处理在某个时刻它在闭包内可能为零的情况。如果你尝试访问一个unowned恰好为nil 的变量,整个程序将会崩溃。因此,仅unowned当您确信变量将始终存在且闭包存在时才使用

始终做好功能准备,因为您在任何移动应用程序中的工作都应该始终是可扩展的。

请参阅这个已接受的答案以获得更好的理解。