在闭包 Swift 中保留循环

希望我有三支枪

我可以在 Swift 中看到许多保留循环的例子。然而,其中许多是不正确的,阅读文档并不能做出我可以遵循的真正简单的例子。

例如:

class Dog {
    func bark() {
        print ("YAP")
    }
}

var dog = Dog()
let doSomething = {
    dog.bark()
}

doSomething()

闭包 doSomething 会导致保留循环吗?我知道关闭会很快执行,但这不是问题。这是否会固有地导致保留循环?

罗伯梅奥夫

您发布的程序中没有保留周期。

什么是保留周期?

将程序中的每个对象(包括每个闭包)视为有向图中的一个顶点。考虑从对象(或闭包)A 到对象(或闭包)B 的强引用作为图中从 A 到 B 的边。

保留循环是图中的循环:包含至少一条边(强引用)的路径,从顶点引回自身。

例如,典型的保留周期如下所示:

从 ViewController 到 View 到 Closure 再到 ViewController 的保留周期

视图控制器始终对其视图具有强引用(如果视图已加载)。在这个例子中,视图控制器创建了一个闭包。闭包捕获(具有强引用)视图控制器。然后视图控制器将闭包存储在视图的一个属性中,创建一个保留循环。

你的程序的保留图是什么?

这是您的程序的保留图:

保留图显示 doSomething 引用狗

此图中没有保留周期。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章