您是否需要在 UIAlertController 处理程序中捕获 self 的 unowned 或weak ?

问题描述 投票:0回答:1

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
的唯一问题吗?

ios swift uiviewcontroller retain-cycle strong-reference-cycle
1个回答
3
投票

该警报确实与

self
有很强的关联性。但
self
对警报没有强烈的参考!它只是发出警报、呈现警报,然后丢弃警报。因此不存在保留周期。

警报只要显示,就会继续保留

self
并防止其消失。但是当警报显示时,
self
不应该消失,所以这也没关系。

© www.soinside.com 2019 - 2024. All rights reserved.