Swift代理中的保留循环

24 浏览
0 Comments

Swift代理中的保留循环

这个问题已经在这里有了答案:

如何在“纯”Swift中创建弱协议引用(无需@objc)

我有一个UIViewController和其中的一个UIToolbar,它们从storyboard实例化。

我为我的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设置为null并清除内存。但感觉不对!

为什么我得到保持循环,为什么我不能简单地将代理定义为weak

admin 更改状态以发布 2023年5月23日
0
0 Comments

weak引用仅适用于类,而不适用于值类型,如结构体或枚举。但是,默认情况下,协议可以应用于任何这些类型。

将您的MainToolBarDelegate定义为仅适用于类的协议:

protocol MainToolBarDelegate: AnyObject {
}

然后您将能够将您的代理声明为weak

0