编写a的handler
闭包时UIAlertAction
,引用应self
为强(默认值)weak
或unowned
吗?
已经有相关与这个主题(帖子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
为零?是。所以我应该标记为。self
weak
但是话又说回来,我想不出一个可能的情况,self
当调用闭包时,该情况将为零。因此,就关闭而言,self
将始终具有价值。所以我应该标记self
为unowned
。
因此,再次,应该如何self
在UIAlertAction的处理程序中捕获呢?
要问自己的关键问题是您的警报对象是否由自己“拥有”。在这种情况下,不是(因为您let alert = ...
在函数体中声明了)。因此,您无需将其创建为弱引用或无主引用。
如果警报是自我的财产,那么它将由自我“拥有”,也就是说,当您希望在警报“拥有”的闭包中创建对自我的弱引用时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句