繁体   English   中英

强,弱或无主参考周期与定时器

[英]Strong, weak or unowned in reference cycle with Timer

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

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

}

在你的情况下weakunowned是可以接受的。 在计时器块内使用简单代码,我建议使用weak ,否则,您可以更喜欢unowned 使用weak来关注项目的未来更新和扩展。

timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: {[weak self] (theTimer) in

        self?.varToReference += 1

    })

保留循环是当两个对象保持对彼此的引用并被保留时的条件,它会创建一个循环,因为两个对象都试图相互保留。

现在让我们来看看你的示例代码

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

unowned weak的区别

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM