是否应该在UIAlertAction的处理程序中把自己强加给?

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

有一些post与这个话题有关( 1,2,3,4 ),但是我真的不明白他们在这种情况下如何提供帮助。

我们来关注一下这个典型的代码:

 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是呈现警报的视图控制器。

该文件说:

只要参考文献有可能在其生命中的某个时刻具有“无价值”,则使用较弱的参考文献以避免参考文献周期。 如果引用将始终有一个值,请改为使用无主引用。

我可能是盲目的,但我仍然不明白这是如何帮助回答我有关UIAlertAction问题。

在上面的代码中,是否有可能在自己的生命中的某个时刻为零? 是。 所以我应该把self标记为weak

但是再一次,我想不出一个合理的情况,当封闭被调用时, self将是零。 所以就封闭而言, self 总是有价值的 。 所以我应该标榜selfunowned

那么,UIAlertAction的处理程序又该如何捕捉self呢?

问自己的关键问题是如果你的警报对象是自己“拥有”。 在这种情况下,它不是(因为您在函数体中声明了let alert = ... )。 所以你不需要创build这个作为一个弱或无主的参考。

如果警报是自我的属性,那么它将被自己“拥有”,那就是当你想在警报“拥有”的封闭中创build对自己的弱引用。