首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift闭包-将自己捕获为弱者

Swift闭包-将自己捕获为弱者
EN

Stack Overflow用户
提问于 2014-09-22 21:15:09
回答 3查看 10.1K关注 0票数 13

我正在尝试解决Swift中基于闭包的强引用循环。

在下面的代码中,对象由拥有的视图控制器保留。ProgressHUD是一个UIView,它也被拥有的视图控制器所保留。每次调用完成处理程序时,都会泄漏ProgressHUD。在使用新的闭包捕获功能时,将self声明为弱或无主并不能解决内存泄漏问题。

代码语言:javascript
复制
object.setCompletionHandler { [weak self] (error) -> Void in
    if(!error){
        self?.tableView.reloadData()
    }
    self?.progressHUD?.hide(false)
}

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

代码语言:javascript
复制
weak var weakSelf = self
object.setCompletionHandler { (error) -> Void in
    if(!error){
        weakSelf?.tableView.reloadData()
    }
    weakSelf?.progressHUD?.hide(false)
}

有没有什么想法可以解释为什么这不适用于Swift捕获?

EN

回答 3

Stack Overflow用户

发布于 2014-12-18 16:39:36

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

source sketchyTech首先,重要的是要明确,整个问题只涉及闭包,我们将赋值为“类实例的属性的闭包”。每条规则都要牢记这一点。规则:

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

对于你的问题,不应该有保留周期。

票数 13
EN

Stack Overflow用户

发布于 2015-12-10 12:40:55

您声明progressHUD由拥有它的视图控制器(self)保留,您在closure...so中引用它,将它添加到捕获列表中,然后在闭包中使用捕获的变量,如下所示:

代码语言:javascript
复制
object.setCompletionHandler { [weak self] (error) -> Void in
    if(!error){
        self?.tableView.reloadData()
    }
    self?.progressHUD.hide(false)
}
票数 5
EN

Stack Overflow用户

发布于 2014-10-14 10:15:17

尝试以下操作:

代码语言:javascript
复制
object.setCompletionHandler { [unowned self] (error) -> () in
    if(!error){
        weakSelf?.tableView.reloadData()
    }
    weakSelf?.progressHUD?.hide(false)
}
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25975073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档