在Swift委托中保留周期

Boc*_*ica 9 delegates ios retain-cycle swift

我有一个UIViewController,其中一个UIToolbar.它们从故事板中实例化.

我为我做了一个自定义课程UIToolbar.根据一些逻辑我做或不显示按钮.

UIViewController当某些按钮被窃听需要采取行动.为此我在中创建了一个委托协议UIToolbar.

目前,当我关闭视图时,它会保留在内存中.进一步调查显示我的代表创建了一个保留周期.

在Objective-C中,我们只需将委托定义为weak.但是,我使用的是Swift,它不允许我将delegate变量定义为weak:

weak var navigationDelegate: MainToolBarDelegate?
// 'weak' cannot be applied to non-class type 'MainToolBarDelegate'
Run Code Online (Sandbox Code Playgroud)

当我关闭视图控制器时,我设置self.toolBar.navigationDelegate = nil并清除内存.但感觉不对劲!

为什么我得到保留周期,为什么我不能简单地将委托定义为weak

Aar*_*ger 17

weak引用仅适用于类,而不是结构或枚举,它们是值类型.但默认情况下,协议可以应用于任何类型.

将您定义MainToolBarDelegate为仅限类的协议:

protocol MainToolBarDelegate: class {

}
Run Code Online (Sandbox Code Playgroud)

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

  • @ user2363025`class`表示任何类,`NSObjectProtocol`表示符合此协议的任何内容.除非你有特殊的理由使用`NSObjectProtocol`,否则我会使用`class`. (2认同)