在阅读了有关此问题的一些帖子后,我发现我的协议应该继承自“class”,以便“weak”能够处理我的委托变量。
“weak”只能应用于类或类绑定协议类型。
如果我的协议不继承自“类”,那么 swift 是否会“推断”它应该是弱的?
这是将“协议”类型的变量转换为weak的事实上的方法吗?
内存管理方面会发生什么
protocol FacebookLoginViewControllerDelegate: class {
func facebookLoginViewControllerDidLogin(controller: FacebookLoginViewController)
}
class FacebookLoginViewController: UIViewController {
weak var delegate: FacebookLoginViewControllerDelegate?
}
制作一个协议类绑定: class
只是告诉编译器它只能表示引用类型 - 因此您可以使用weak
其上的属性。
如果你没有将协议标记为类绑定,那么 Swift 会假设它可以代表either引用或值类型。因为ARC(自动参考计数)仅适用于引用,而不适用于值,那么编译器将阻止您将weak
其上的属性。
ARC 不适用于值类型的原因是因为它们得到copied当您传递它们时,而不是通过引用传递它们。因此,与引用类型不同,它们的内存可以轻松管理,因为它们的生命周期是超级可预测的。
对于引用类型,如果您使用委托模式,那么delegate
应该永远是weak
为了避免循环引用——因此协议应该始终是类绑定的。对委托使用值类型几乎没有任何意义,因为它始终引用您分配给它的内容的副本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)