加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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是一个类,所以它应该是可能的,因此你总是可以声明它的弱引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读