在 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
。
我有一个 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
。