Swift:如何解决types为“protocol”的弱variables是非法的问题

在阅读了关于这个问题的一些post之后,我发现我的协议应该从'class'inheritance,以便'weak'在我的委托variables上工作。

“弱”可能只适用于类或类绑定的协议types。

如果我的协议不从“类”inheritance,是否迅速“推断”它应该是弱?

这是铸造“协议”types的variables变弱的事实上的方式?

内存pipe理方面会发生什么?

protocol FacebookLoginViewControllerDelegate: class { func facebookLoginViewControllerDidLogin(controller: FacebookLoginViewController) } class FacebookLoginViewController: UIViewController { weak var delegate: FacebookLoginViewControllerDelegate? } 

用类绑定一个协议类只是告诉编译器它只能表示一个引用types – 因此你可以使用weak属性。

如果你没有把一个协议标记为类绑定,那么Swift会假定它可能代表一个引用types或值types。 由于ARC(自动引用计数)仅适用于引用,而不是值,因此编译器将阻止您将weak属性放在上面。

ARC不能处理值types的原因是因为它们在传递时被复制 ,而不是被引用传递。 因此,他们的记忆可以很容易地pipe理,因为他们的生活是超级预测的,不像参考类

对于引用types,如果使用委托模式,那么为了避免保留周期, delegate应该总是weak – 因此协议应该始终是类绑定的。 为代理使用值types几乎没有意义,因为它总是指向您分配给它的副本。