是否应该在UIAlertAction的处理程序中把自己强加给?
在编写UIAlertAction
的handler
闭包时,对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
总是有价值的 。 所以我应该标榜self
是unowned
。
那么,UIAlertAction的处理程序又该如何捕捉self
呢?
问自己的关键问题是如果你的警报对象是自己“拥有”。 在这种情况下,它不是(因为您在函数体中声明了let alert = ...
)。 所以你不需要创build这个作为一个弱或无主的参考。
如果警报是自我的属性,那么它将被自己“拥有”,那就是当你想在警报“拥有”的封闭中创build对自己的弱引用。