ios – Swift:如何解决“协议”类型的弱变量是非法的问题

在阅读了有关此问题的一些帖子之后,我发现我的协议应该继承“class”,以便’weak’能够处理我的委托变量.

‘weak’可能只适用于类或类绑定协议类型.

如果我的协议没有从’class’继承,那么swift‘推断’它应该是弱的吗?

这是将“协议”类型的变量强制转换为弱的事实上的方法吗?

在内存管理方面会发生什么

protocol FacebookLoginViewControllerDelegate: class {
    func facebookLoginViewControllerDidLogin(controller: FacebookLoginViewController)
}

class FacebookLoginViewController: UIViewController {

    weak var delegate: FacebookLoginViewControllerDelegate?

}

解决方法

使用:class绑定的协议类只是告诉编译器它只能表示一个引用类型 – 因此你可以在它上面使用weak属性.

如果不将协议标记为类绑定,则Swift将假定它可以表示引用或值类型.因为ARC(自动引用计数)仅适用于引用,而不适用于值,因此编译器将阻止您将弱属性放在其上.

ARC不能使用值类型的原因是因为它们在传递它们时会被复制,而不是通过引用传递.因此,与参考类型不同,它们的内存可以轻松管理,因为它们的生命周期是超可预测

对于引用类型,如果您正在使用委托模式,那么委托应始终为弱以避免保留周期 – 因此协议应始终是类绑定的.使用委托的值类型几乎没有任何意义,因为它总是引用您分配给它的副本.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...