对子视图的引用应该弱吗?

时间:2020-03-17 14:18:38

标签: swift

对子视图的引用应该弱吗?

换句话说,在初始化CustomView实例,将其添加到视图层次结构并调用setupUI函数之后,此代码是否会导致保留周期?

class CustomView: UIView {
  let subview = UIView()

  func setupUI() {
    self.addSubview(subview)
  }
}

2 个答案:

答案 0 :(得分:2)

根据Docs

addSubview

此方法为查看建立了强大的参考,并将其下一个响应者设置为接收者,这是它的新超级视图

父视图与其子视图之间没有保留周期,可以添加/删除子视图,并且当取消分配超级视图时,也将释放子视图

答案 1 :(得分:1)

此代码会导致保留周期...吗?

否,它不会导致较强的参考周期(以前称为“保留周期”)。在这种情况下,您可以放心使用强引用。

只有当两个(或多个)对象彼此具有强引用时,您才会获得强引用循环。但是您的子视图没有强大的引用可以返回到其父视图,因此这里没有强大的参考周期的风险。而且,如果您的子视图确实需要备份到其父视图(例如,委托协议模式,完成处理程序闭包等),那么这就是您要进行的weak引用,而不是{{1}的引用}必须CustomView

对子视图的引用应该是subview吗?

当您调用weak时,这会将子视图添加到视图层次结构中,这恰好为这个新子视图建立了自己的强引用。因此,如果您要在将该子视图添加到视图层次结构后创建自己的引用,从技术上讲,该引用是弱引用还是强引用都没有关系。它可能很弱(因为视图层次结构为您维护着强大的参考),也可能很弱(因为您没有参考周期)。不需要的话,您根本不需要保留自己对addSubview的引用,并确信视图层次结构将保留必要的强引用。

现在,在您的特定示例中,您要先定义subview ,然后再将其添加到视图层次结构中,因此您碰巧需要使用强引用来确保它不存在。在您致电subview之前,请先解除分配。但是,相反,在定义setupUI引用时,通常可以安全地使用弱引用或强引用,而不会发生意外。

我肯定会建议使用强引用来生成自然代码(例如您的示例)。在某些情况下,弱引用显然是更可取的(例如,子视图可以在以后删除...从而使我们不必手动@IBOutlet引用)。关于“子视图应使用弱引用”的一般规则,虽然传统观点已转向“使用强引用”(例如Should IBOutlets be strong or weak under ARC?),但弱引用没有实质性错误,因此我建议您选择一个约定并坚持下去。

相关问题