在WWDC 2014会议403 中级Swift和成绩单中,有以下幻灯片

在这种情况下,发言人说,如果我们不在[unowned self]那里使用,那将是内存泄漏.这是否意味着我们应该始终使用[unowned self]内部封闭?
在Swift Weather应用程序的ViewController.swift的第64行,我不使用[unowned self].但我通过使用一些@IBOutlet像self.temperature和更新UI self.loadingIndicator.它可能没问题,因为@IBOutlet我所定义的都是weak.但为了安全起见,我们应该一直使用[unowned self]吗?
class TempNotifier {
var onChange: (Int) -> Void = {_ in }
var currentTemp = 72
init() {
onChange = { [unowned self] temp in
self.currentTemp = temp
}
}
}
Run Code Online (Sandbox Code Playgroud) 传统上在Objc中,我们使用weakSelf来防止块的额外保留计数.
swift内部如何管理Objc块中发生的保留周期?
我试图在Swift中解决基于闭包的强引用循环.
在下面的代码中,对象由拥有的视图控制器保留.ProgressHUD是一个UIView由拥有的视图控制器保留的.ProgressHUD每次调用完成处理程序时都会泄露.使用新的闭包捕获功能时,将self声明为weak或unowned并不能解决内存泄漏问题.
object.setCompletionHandler { [weak self] (error) -> Void in
if(!error){
self?.tableView.reloadData()
}
self?.progressHUD?.hide(false)
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在闭包之外为self声明一个弱var,它会修复内存泄漏,如下所示:
weak var weakSelf = self
object.setCompletionHandler { (error) -> Void in
if(!error){
weakSelf?.tableView.reloadData()
}
weakSelf?.progressHUD?.hide(false)
}
Run Code Online (Sandbox Code Playgroud)
关于为什么这不适用于Swift捕获的任何想法?
我希望self不为nil,并且我肯定会在执行块的过程中将其设为nil。那么,为什么要明确指定[无主的自我]?
object.executeBlock {
date = self.lastModified
}
Run Code Online (Sandbox Code Playgroud)
与
object.executeBlock { [unowned self] in
date = self.lastModified
}
Run Code Online (Sandbox Code Playgroud)
编辑:好吧,我正在减票,所以让我们再试一次。问:比方说我有问题。那个问题是我想防止参考周期。我有两个选择。我可以使用[无主的自我],也可以使用[弱的自我]。因此,我的问题是:从这两个选项中,为什么我会选择[无主的自我]?为什么不每次都选择[弱自我]?