一尘不染

Swift委托-何时在委托上使用弱指针

swift

有人可以解释何时以及何时不使用Swift中的委托指针进行“弱”分配,为什么?

我的理解是,如果您使用的协议未定义为类,则无法,也不想将您的委托指针分配给弱。

protocol MyStructProtocol{
    //whatever
}

struct MyStruct {
    var delegate: MyStructProtocol?
}

但是,当您的协议定义为类类型协议时,您是否要将委托设置为弱指针?

protocol MyClassProtocol: class{
    //whatever
}

class MyClass {
    weak var delegate: MyClassProtocol?
}

我对么?在Apple的快速指南中,类协议示例没有使用弱分配,但是在我的测试中,如果没有弱引用我的委托人,我会看到强参考周期。


阅读 175

收藏
2020-07-07

共1个答案

一尘不染

通常,使类协议(如用class关键字定义)较弱,以避免“强参考周期”(以前称为“保留周期”)的风险。未能使代表人软弱,并不意味着您固有地拥有强大的参考周期,而仅仅是您
可以 拥有一个参考周期。

struct但是,对于类型,由于struct类型不是“引用”类型,因此大大降低了强引用循环的风险,因此很难创建强引用循环。但是,如果委托对象是类对象,那么您可能希望将协议设置为类协议并使其变弱。

我认为,使班级代表软弱只是部分缓解了强大的参考周期风险。这实际上是“所有权”的问题。大多数委托协议是在这样的情况下,所讨论的对象没有业务要求对委托人拥有所有权,而仅仅是在所讨论的对象提供告知某事(或请求某事)的能力。

2020-07-07