Weak vs Unowned for non-optional delegates

min*_*eow 5 ios swift swift2

如果我的viewcontroller必须使用委托进行初始化,那么使用unowned是否有任何危险呢?

使用弱似乎会引入函数失败的概率(见下文),尽管它不会崩溃.

在这种情况下使用无主的是否会不安全?

class MyViewController: UIViewController
  private weak var delegate: MyViewControllerDelegate?
  init(delegate: MyViewControllerDelegat) {
    self.delegate = delegate
  }
  func foobar {
    delegate??
  }
Run Code Online (Sandbox Code Playgroud)

相比

class MyViewController: UIViewController
  private unowned var delegate: MyViewControllerDelegate
  init(delegate: MyViewControllerDelegate) {
    self.delegate = delegate
  }
  func foobar {
    delegate.doAction()
  }
Run Code Online (Sandbox Code Playgroud)

Yan*_*ick 5

苹果文档

只要该引用在其生命周期内的某个时刻变为 nil 有效,就可以使用弱引用。相反,当您知道该引用一旦在初始化期间设置后就永远不会为零时,请使用无主引用。

因此,在您的情况下,如果您知道委托将在整个生命周期中存在,那么请使用unowned.

weak和的区别unowned在于,weak 可以为 nil,而 unowned 则不能为 nil。unowned两者都不会增加保留周期,并且只要您不释放委托就没有危险。


Sul*_*han 3

如果您的控制器必须使用委托进行初始化,并且控制器在没有它的情况下无法工作,那么这unowned是正确的解决方案。但是,您必须确保在控制器被释放之前,委托永远不会被释放。通常,委托人应该是控制器的所有者。

不过,使用起来weak也不复杂:

delegate?.doAction()
Run Code Online (Sandbox Code Playgroud)