在 Swift 委托中保留循环

Retain Cycle in Swift delegate

我有一个 UIViewController,里面有一个 UIToolbar。他们从情节提要中实例化。

我为我的 UIToolbar 定制了 class。基于一些逻辑,我在上面显示或不显示按钮。

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

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

将您的 MainToolBarDelegate 定义为 class-only 协议:

protocol MainToolBarDelegate: class {

}

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