相关疑难解决方法(0)

我们总是在Swift中使用[unowned self]内部封闭

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

在此输入图像描述

在这种情况下,发言人说,如果我们不在[unowned self]那里使用,那将是内存泄漏.这是否意味着我们应该始终使用[unowned self]内部封闭?

Swift Weather应用程序的ViewController.swift的第64行,我不使用[unowned self].但我通过使用一些@IBOutletself.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)

ios automatic-ref-counting swift

455
推荐指数
7
解决办法
14万
查看次数

在Swift中阻止保留周期?

传统上在Objc中,我们使用weakSelf来防止块的额外保留计数.

swift内部如何管理Objc块中发生的保留周期?

swift

50
推荐指数
3
解决办法
2万
查看次数

快速关闭 - 将自我捕捉为弱者

我试图在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捕获的任何想法?

closures weak-references swift

13
推荐指数
3
解决办法
8841
查看次数

为什么要在依赖自我的地方指定[unown self]?

我希望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)

编辑:好吧,我正在减票,所以让我们再试一次。问:比方说我有问题。那个问题是我想防止参考周期。我有两个选择。我可以使用[无主的自我],也可以使用[弱的自我]。因此,我的问题是:从这两个选项中,为什么我会选择[无主的自我]?为什么不每次都选择[弱自我]?

block retain-cycle swift

5
推荐指数
1
解决办法
1345
查看次数