self 是否应该在 UIAlertAction 的处理程序中被捕获为强?

Should self be captured as strong in a UIAlertAction's handler?

在编写 UIAlertActionhandler 闭包时,对 self 的引用应该是强引用(默认)、weak 还是 unowned

有与此主题相关的帖子 (1, 2, 3, ),但老实说,我看不出它们对这种情况有何帮助。

让我们关注这个典型的代码:

func tappedQuitButton() {
    let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet)

    let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    alert.addAction(quitAction)

    let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    alert.addAction(cancelAction)

    presentViewController(alert, animated: true, completion: nil)
}

这是 UIViewController 子类中的函数,因此 self 是呈现警报的视图控制器。

documentation 说:

Use a weak reference to avoid reference cycles whenever it is possible for that reference to have “no value” at some point in its life. If the reference will always have a value, use an unowned reference instead.

我可能是瞎子,但我仍然看不出这对回答我关于 UIAlertAction 的问题有何帮助。

在上面的代码中,self 是否有可能在其生命周期的某个时刻 为 nil ?是的。所以我应该将 self 标记为 weak.

但话又说回来,我想不出在调用闭包时 self 将为 nil 的合理场景。因此,就闭包而言,self 将始终具有一个值 。所以我应该将 self 标记为 unowned

所以,再一次,应该如何 self 在 UIAlertAction 的处理程序中捕获?

要问自己的关键问题是您的警报对象是否是 "owned" 自己。在这种情况下,它不是(因为您在函数体中声明了 let alert = ...)。因此您不需要将其创建为弱引用或无主引用。

如果 alert 是 self 的 属性,那么它将是 self 的 "owned",这就是您想要在闭包中创建对 self 的弱引用的时候 "owned"通过警报。