gpt4 book ai didi

ios - 关于 Swift 中闭包的强引用循环

转载 作者:搜寻专家 更新时间:2023-10-31 22:41:35 24 4
gpt4 key购买 nike

我已经定义了一个名为 Person 的类。这是我的代码:

    class Person { 
var closure: (() -> ())?
var name: String

init(name: String) {

self.name = name
print("\(name) is being initialized")
}

deinit {
print("\(name) is being deinitialized")
}
}

然后我在名为 ViewController 的类中使用 Person:

class ViewController: UIViewController {

var person = Person(name: "john")
let aStr = "john is a cute boy"


override func viewDidLoad() {
super.viewDidLoad()

person.closure = {
print("\(self.aStr)")
}
person.closure!()
}
}

在我看来,关于我的代码的内存图片是这样的: memory

所以,从上面的图片来看,在我看来,这会导致三个实例之间的强引用循环,但是我无法从 Instruments 中获取任何泄漏,所以我有些困惑。

这段代码会引起强引用循环吗?

如果不是,ARC 什么时候会释放 Person 的实例? Person 类中名为 deinit 的方法永远不会被调用。

最佳答案

是的,这是一个典型的保留周期。

要解决这个问题,请在闭包中使用[weak self]

person.closure = { [weak self] in
guard let strongSelf = self else { return }
print("\(strongSelf.aStr)")
}

真正制造漏洞。
我创建了一个演示应用程序。 Root 是一个 navController。
navController 有一个根 Controller 。我们称它为 buttonController。当您单击 buttonController 中的按钮时,它会创建您的 ViewController 并推送到 navController。当您单击导航栏中的后退按钮时,navController 会弹出您的 ViewController 实例。

分析它,然后您将在 Instruments 中看到泄漏和保留周期。

iOS 应用程序的 Xcode 默认模板使用单个页面,它始终保留您的 ViewController 实例。如果 ViewController 实例仍然被系统使用,它实际上还不是泄漏。因此,push & pop 会为您显示泄漏。

关于ios - 关于 Swift 中闭包的强引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45367085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com