对于非可选委托

时间:2016-08-23 08:01:06

标签: ios swift swift2

如果我的viewcontroller必须使用委托进行初始化,那么使用无主的方法是否存在任何危险呢?

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

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

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

相比
class MyViewController: UIViewController
  private unowned var delegate: MyViewControllerDelegate
  init(delegate: MyViewControllerDelegate) {
    self.delegate = delegate
  }
  func foobar {
    delegate.doAction()
  }

2 个答案:

答案 0 :(得分:3)

Apple Documentation

  

只要对该引用有效,就使用弱引用   在其一生中的某个时刻没有。相反,使用无主   当你知道引用永远不会为零时引用   已在初始化期间设置。

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

weakunowned之间的区别在于,弱者可以是零,无主,不能为零。两者都不会添加到保留周期,只要您不释放代理,unowned就没有危险。

答案 1 :(得分:2)

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

但是,使用weak并不复杂:

delegate?.doAction()