有人可以解释何时以及何时不使用Swift中的委托指针进行“弱”分配,为什么?
我的理解是,如果您使用的协议未定义为类,则无法,也不想将您的委托指针分配给弱。
protocol MyStructProtocol{ //whatever } struct MyStruct { var delegate: MyStructProtocol? }
但是,当您的协议定义为类类型协议时,您是否要将委托设置为弱指针?
protocol MyClassProtocol: class{ //whatever } class MyClass { weak var delegate: MyClassProtocol? }
我对么?在Apple的快速指南中,类协议示例没有使用弱分配,但是在我的测试中,如果没有弱引用我的委托人,我会看到强参考周期。
通常,使类协议(如用class关键字定义)较弱,以避免“强参考周期”(以前称为“保留周期”)的风险。未能使代表人软弱,并不意味着您固有地拥有强大的参考周期,而仅仅是您 可以 拥有一个参考周期。
class
struct但是,对于类型,由于struct类型不是“引用”类型,因此大大降低了强引用循环的风险,因此很难创建强引用循环。但是,如果委托对象是类对象,那么您可能希望将协议设置为类协议并使其变弱。
struct
我认为,使班级代表软弱只是部分缓解了强大的参考周期风险。这实际上是“所有权”的问题。大多数委托协议是在这样的情况下,所讨论的对象没有业务要求对委托人拥有所有权,而仅仅是在所讨论的对象提供告知某事(或请求某事)的能力。