UIAlertAction
的处理程序是否需要[weak self]
或[unowned self]
来避免保留循环,或者可以将其保留为强引用吗?
例如
extension UIViewController {
func showAlert() {
let alert = UIAlertController(
title: "Foo",
message: "Bar",
preferredStyle: .alert
)
alert.addAction(
.init(
title: "OK",
style: .default
) {
self.doSomething()
}
)
present(alert, animated: true)
}
}
处理程序闭包保留
self
。 alert
永远不会被 self
显式保留,但是 self
会因为调用 present
而隐式保留它吗?您如何确定情况是否如此?也许这种不确定性足以成为不使用强参考的理由......
我知道什么时候应该使用
unowned
,什么时候应该使用 weak
。我的问题是关于包含这两者中的任何一个还是不包含任何内容,即将其作为强有力的参考。有很多关于此的博客文章和问题,但大多数都集中在 weak
与 unowned
上,并且在您不需要使用它们中的任何一个时并没有真正扩展。
我知道实际上你可以总是把
[weak self]
放在任何地方,这并不是真正的性能问题。但我试图理解什么时候它是真正必要的,什么时候它只是噪音。此处使用警报作为示例,但我也有兴趣培养对此的总体感觉,因此当我选择包含或排除 [weak self]
或 [unowned self]
时,我可以证明自己的合理性。
保留循环是闭包内强引用
self
的唯一问题吗?
该警报确实与
self
有很强的关联性。但self
对警报没有强烈的参考!它只是发出警报、呈现警报,然后丢弃警报。因此不存在保留周期。
警报只要显示,就会继续保留
self
并防止其消失。但是当警报显示时,self
不应该消失,所以这也没关系。