gpt4 book ai didi

Swift Closures - 将 self 捕捉为弱者

转载 作者:IT王子 更新时间:2023-10-29 05:27:07 24 4
gpt4 key购买 nike

我正在尝试解决 Swift 中基于闭包的强引用循环。
在下面的代码中,对象由拥有的 View Controller 保留。 ProgressHUD 是一个 UIView,它也由拥有的 View Controller 保留。 ProgressHUD 每次调用完成处理程序时都会泄漏。使用新的闭包捕获功能时,将 self 声明为 weak 或 unowned 并不能解决内存泄漏问题。

object.setCompletionHandler { [weak self] (error) -> Void in
if(!error){
self?.tableView.reloadData()
}
self?.progressHUD?.hide(false)
}

但是,如果我在闭包之外为 self 声明一个弱变量,它会修复内存泄漏,如下所示:

weak var weakSelf = self
object.setCompletionHandler { (error) -> Void in
if(!error){
weakSelf?.tableView.reloadData()
}
weakSelf?.progressHUD?.hide(false)
}

关于为什么这不适用于 Swift 捕获的任何想法?

最佳答案

如果您将闭包分配给类实例的属性,并且闭包通过引用该实例或其成员来捕获该实例,您将在闭包和实例之间创建一个强引用循环。 Swift 使用捕获列表来打破这些强引用循环。 source Apple

source sketchyTech首先,重要的是要明确整个问题只涉及我们分配“类实例属性的闭包”的闭包。在每条规则中记住这一点。规则:

  1. 如果类实例或属性是可选的,则使用弱捕获
  2. 如果类实例或属性是非可选的并且永远不能设置为 nil,则使用 unowned
  3. “您必须...使用 in 关键字,即使您省略了参数名称、参数类型和返回类型”

在回答您的问题时,应该没有保留周期。

关于Swift Closures - 将 self 捕捉为弱者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25975073/

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