Swift代理中保留循环[副本]

hi3rlvi2  于 2022-12-10  发布在  Swift
关注(0)|答案(1)|浏览(115)

此问题在此处已有答案

How can I make a weak protocol reference in 'pure' Swift (without @objc)(7个答案)
七年前就关门了。
我有一个UIViewController,其中有一个UIToolbar,它们是从故事板示例化的。
我为我的UIToolbar做了一个自定义类。基于一些逻辑,我在上面显示或不显示按钮。
UIViewController需要在一些按钮被点击时采取行动。为此我在UIToolbar中创建了一个委托协议。
目前,当我关闭检视时,它会保留在内存中。进一步的调查显示我的委派建立了保留循环。
在Objective-C中,我们会简单地将委托定义为weak。但是,我使用的是Swift,它不允许我将delegate变量定义为weak

weak var navigationDelegate: MainToolBarDelegate?
// 'weak' cannot be applied to non-class type 'MainToolBarDelegate'

当我关闭视图控制器时,我设置了self.toolBar.navigationDelegate = nil,内存被清除了。但是感觉不对!
为什么我会得到保留周期,为什么我不能简单地将委托定义为weak

klr1opcd

klr1opcd1#

weak引用只适用于类,而不适用于结构或枚举,它们都是值类型。但默认情况下,协议可以适用于这些类型中的任何一种。
MainToolBarDelegate定义为仅类协议:

protocol MainToolBarDelegate: AnyObject {

}

然后,您就可以将委托声明为weak

相关问题