Ios 在Swift委托中保留循环

Ios 在Swift委托中保留循环,ios,swift,delegates,retain-cycle,Ios,Swift,Delegates,Retain Cycle,我有一个UIViewController和一个UIToolbar。它们从故事板中得到实例化 我为我的UIToolbar创建了一个自定义类。根据一些逻辑,我会或不会在上面显示按钮 点击某些按钮时,UIViewController需要采取措施。 为此,我在UIToolbar中创建了一个委托协议 当前,当我关闭视图时,它会保留在内存中。进一步调查显示,我的代表创建了一个保留周期 在Objective-C中,我们只需将委托定义为弱。但是,我使用的是Swift,它不允许我将委托变量定义为弱: weak v

我有一个
UIViewController
和一个
UIToolbar
。它们从故事板中得到实例化

我为我的
UIToolbar
创建了一个自定义类。根据一些逻辑,我会或不会在上面显示按钮

点击某些按钮时,
UIViewController
需要采取措施。 为此,我在
UIToolbar
中创建了一个委托协议

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

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

weak var navigationDelegate: MainToolBarDelegate?
// 'weak' cannot be applied to non-class type 'MainToolBarDelegate'
当我关闭视图控制器时,我设置了
self.toolBar.navigationDelegate=nil
,内存被清除。但是感觉不对


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

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

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

protocol MainToolBarDelegate: class {

}

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

您的NavigationDelegate是一个协议(与a相反?)吗?如果它只是一个标准协议,则无法保证您的实际对象将是一个类实例而不是一个结构,因此“不能应用于非类类型”;如果它可以是结构或枚举,那么它就不能是弱的,因为它可能不是引用类型。您知道使用:class或:NSObjectProtocol@user2363025
class
表示任何类,
NSObjectProtocol
表示符合此协议的任何内容。我会使用
class
,除非您有特定的理由使用
NSObjectProtocol