对子视图的引用应该弱吗?
换句话说,在初始化CustomView实例,将其添加到视图层次结构并调用setupUI函数之后,此代码是否会导致保留周期?
class CustomView: UIView {
let subview = UIView()
func setupUI() {
self.addSubview(subview)
}
}
答案 0 :(得分:2)
根据Docs
addSubview
此方法为查看建立了强大的参考,并将其下一个响应者设置为接收者,这是它的新超级视图
父视图与其子视图之间没有保留周期,可以添加/删除子视图,并且当取消分配超级视图时,也将释放子视图
答案 1 :(得分:1)
此代码会导致保留周期...吗?
否,它不会导致较强的参考周期(以前称为“保留周期”)。在这种情况下,您可以放心使用强引用。
只有当两个(或多个)对象彼此具有强引用时,您才会获得强引用循环。但是您的子视图没有强大的引用可以返回到其父视图,因此这里没有强大的参考周期的风险。而且,如果您的子视图确实需要备份到其父视图(例如,委托协议模式,完成处理程序闭包等),那么这就是您要进行的weak
引用,而不是{{1}的引用}必须CustomView
。
对子视图的引用应该是
subview
吗?
当您调用weak
时,这会将子视图添加到视图层次结构中,这恰好为这个新子视图建立了自己的强引用。因此,如果您要在将该子视图添加到视图层次结构后创建自己的引用,从技术上讲,该引用是弱引用还是强引用都没有关系。它可能很弱(因为视图层次结构为您维护着强大的参考),也可能很弱(因为您没有参考周期)。不需要的话,您根本不需要保留自己对addSubview
的引用,并确信视图层次结构将保留必要的强引用。
现在,在您的特定示例中,您要先定义subview
,然后再将其添加到视图层次结构中,因此您碰巧需要使用强引用来确保它不存在。在您致电subview
之前,请先解除分配。但是,相反,在定义setupUI
引用时,通常可以安全地使用弱引用或强引用,而不会发生意外。
我肯定会建议使用强引用来生成自然代码(例如您的示例)。在某些情况下,弱引用显然是更可取的(例如,子视图可以在以后删除...从而使我们不必手动@IBOutlet
引用)。关于“子视图应使用弱引用”的一般规则,虽然传统观点已转向“使用强引用”(例如Should IBOutlets be strong or weak under ARC?),但弱引用没有实质性错误,因此我建议您选择一个约定并坚持下去。