Swift委托 – 何时在委托上使用弱指针
有人可以解释什么时候,什么时候不使用“弱”赋值给Swift中的委托指针,为什么?
我的理解是,如果您使用未定义为类的协议,则不能也不希望将委派指针分配给弱。
protocol MyStructProtocol{ //whatever } struct MyStruct { var delegate: MyStructProtocol? }
但是,当你的协议被定义为一个类types的协议,那么你想设置你的委托给一个弱指针?
protocol MyClassProtocol:Class{ //whatever } class MyClass { weak var delegate: MyClassProtocol? }
我对么? 在苹果的快速指南中,类协议的例子并没有使用弱分配,但是在我的testing中,如果我的代表没有被弱引用,我会看到很强的参考周期。
您通常使类协议(由class
关键字定义)很弱,以避免“强参考周期”(以前称为“保留周期”)的风险。 如果不让代表变弱,这并不意味着你本身就有一个强大的参考周期,而只是说你可以有一个参考周期。
然而,对于struct
types来说,由于struct
types不是“参考”types,所以强参考循环的风险大大降低,因此创build强参考循环比较困难。 但是,如果委托对象是一个类对象,那么你可能希望使协议成为一个类协议,并使其变弱。
在我看来,让class级代表薄弱仅仅是为了减轻强大的参照周期的风险。 这实际上是一个“所有权”的问题。 大多数委托协议是指所讨论的对象没有声称拥有委托的所有权的情况,而仅仅是所讨论的对象提供通知委托的能力(或者请求某事)的情况。
代表应该总是很弱。
可以说b
是b
的代表。 现在delegate
财产是b
。
在c
不在的情况下想要b
释放的情况下
如果c
持有对b
和c
的强烈引用,那么你希望b
使用c
来释放。 但是,在a
使用强大的委托属性, b
将永远不会被释放,因为b
强烈地坚持b
。 使用弱引用,只要b
失去了c
的强引用, b
就会在c
释放时释放。
通常这是预期的行为,这就是为什么你想使用weak
财产。
protocol MyDelegate: class { // ... } class MyViewController: UIViewController { weak var delegate: MyDelegate? }