Swift委托协议无法阻止保留周期问题
发布时间:2020-12-14 04:54:45 所属栏目:百科 来源:网络整理
导读:在 Swift中,如果我创建一个委托协议,它可以通过类和结构符合. protocol MyDelegate { // Can be conformed to by class or struct} 当我宣布代表时,问题出现了.如果委托是一个类实例,我希望变量是弱的,以避免保留循环.如果它是一个结构,就没有这样的需求 –
在
Swift中,如果我创建一个委托协议,它可以通过类和结构符合.
protocol MyDelegate { // Can be conformed to by class or struct } 当我宣布代表时,问题出现了.如果委托是一个类实例,我希望变量是弱的,以避免保留循环.如果它是一个结构,就没有这样的需求 – 实际上,Swift不允许我使委托变量变弱.注意:我知道如何创建一个弱委托,但关键问题是 – 如果你创建一个可能很弱的委托协议,除非你只使它符合类,否则你不能强制执行保留周期. class MyClass { // Want weak var here to avoid cyclical reference // but Swift won't allow it because MyDelegate can be // conformed by struct as well. Dropping weak means // cyclical reference cannot be prevented weak var delegate: MyDelegate? } class MyConformingClass: MyDelegate { } or struct MyConformingStruct: MyDelegate { } 似乎我们需要在任何时候都将这个协议声明为类,因为非常规委托协议无法阻止保留周期: protocol MyDelegate: class { } Swift允许你以这种方式射击自己的事实似乎违背了其安全设计理念. 解决方法
保留周期需要两个……
如果你真的想以这种方式去做,那么为什么不把弱者留下来,只是让它成为一个强有力的参考.如果委托还维护了对其委派的对象的强引用,那么您将遇到问题. 因此,代理人有责任确保任何互惠引用都是弱的,因为MyClass是一个类,所以它应该是可能的,因此你总是可以声明它的弱引用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sqlite应用2
- PostgreSQL 的临时表、全局临时表和 Unlogged 表
- 如何捕获dijit.form.NumberSpinner的递增和递减事件?
- ruby – 为什么“foo”.class === String返回false?
- ruby-on-rails – 将纯文本URL转换为Ruby on Rails中的HTML
- c# – 使用不安全的代码是否有任何性能损失或线程上下文切换
- ruby-on-rails – Rails / Rspec – 编写涉及自定义验证和b
- Spring boot json response indent配置
- C#实现随机数产生类实例
- vb.net 教程 5-15 图像处理之内存处理1