我正在尝试解决Swift中基于闭包的强引用循环。
在下面的代码中,对象由拥有的视图控制器保留。ProgressHUD是一个UIView,它也被拥有的视图控制器所保留。每次调用完成处理程序时,都会泄漏ProgressHUD。在使用新的闭包捕获功能时,将self声明为弱或无主并不能解决内存泄漏问题。
object.setCompletionHandler { [weak self] (error) -> Void in
if(!error){
self?.tableView.reloadData()
}
self?.progressHUD?.hide(false)
}但是,如果我在闭包之外为self声明了一个弱var,它就会修复内存泄漏,如下所示:
weak var weakSelf = self
object.setCompletionHandler { (error) -> Void in
if(!error){
weakSelf?.tableView.reloadData()
}
weakSelf?.progressHUD?.hide(false)
}有没有什么想法可以解释为什么这不适用于Swift捕获?
发布于 2014-12-18 16:39:36
如果将闭包分配给类实例的属性,并且闭包通过引用该实例或其成员来捕获该实例,则将在闭包和实例之间创建一个强引用循环。Swift使用捕获列表来打破这些强大的引用循环。source Apple
source sketchyTech首先,重要的是要明确,整个问题只涉及闭包,我们将赋值为“类实例的属性的闭包”。每条规则都要牢记这一点。规则:
对于你的问题,不应该有保留周期。
发布于 2015-12-10 12:40:55
您声明progressHUD由拥有它的视图控制器(self)保留,您在closure...so中引用它,将它添加到捕获列表中,然后在闭包中使用捕获的变量,如下所示:
object.setCompletionHandler { [weak self] (error) -> Void in
if(!error){
self?.tableView.reloadData()
}
self?.progressHUD.hide(false)
}发布于 2014-10-14 10:15:17
尝试以下操作:
object.setCompletionHandler { [unowned self] (error) -> () in
if(!error){
weakSelf?.tableView.reloadData()
}
weakSelf?.progressHUD?.hide(false)
}https://stackoverflow.com/questions/25975073
复制相似问题