此问题在此处已有答案:
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
?
1条答案
按热度按时间klr1opcd1#
weak
引用只适用于类,而不适用于结构或枚举,它们都是值类型。但默认情况下,协议可以适用于这些类型中的任何一种。将
MainToolBarDelegate
定义为仅类协议:然后,您就可以将委托声明为
weak
。