gpt4 book ai didi

swift - 对 subview 的引用应该弱吗?

转载 作者:行者123 更新时间:2023-12-02 00:05:39 25 4
gpt4 key购买 nike

对 subview 的引用应该是弱引用吗?

也就是说,这段代码会不会在初始化CustomView实例,将其添加到 View 层级并调用setupUI函数后造成retain cycle?

class CustomView: UIView {
let subview = UIView()

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

最佳答案

will this code cause retain cycle ... ?

不会,不会造成强引用循环(以前称为“retain cycle”)。在这种情况下,您可以安全地使用强引用。

只有当两个(或更多)对象彼此有强引用时,你才会得到强引用循环。但是您的 subview 没有对其父 View 的强引用,因此这里不存在强引用循环的风险。如果你的 subview 确实需要一个引用备份到它的父 View (例如委托(delegate)协议(protocol)模式、完成处理程序闭包等),那是你要使 weak 的引用,而不是 CustomView 必须 subview

Should references to subviews be weak?

当您调用 addSubview 时,会将 subview 添加到 View 层次结构中,这巧合地建立了自己对此新 subview 的强引用。出于这个原因,如果您在将此 subview 添加到 View 层次结构后创建自己对该 subview 的引用,那么从技术上讲,此引用是弱引用还是强引用都没有关系。它可以是弱的(因为 View 层次结构为你维护了一个强引用)也可以是强的(因为你没有引用循环)。如果您不想,您根本不需要保留自己对 subview 的引用,确信 View 层次结构将保留对它的必要强引用。

现在,在您的特定示例中,您正在定义您的 subview before 将其添加到 View 层次结构中,因此您碰巧需要使用强引用来确保在您调用 setupUI 之前,它不会被释放。但是,相比之下,在定义 @IBOutlet 引用时,您通常可以安全地使用弱引用或强引用而不会发生意外。

我当然会建议在自然代码产生的地方使用强引用(比如你的例子)。在某些情况下,弱引用显然更可取(例如,稍后可能会删除的 subview ......它使我们不必手动 nil 引用)。关于“ subview 应该使用弱引用”的一般规则,而传统智慧已经转变为“使用强引用”(例如 Should IBOutlets be strong or weak under ARC? ),弱引用没有实质性错误,所以我建议只选择一个约定并坚持与它。

关于swift - 对 subview 的引用应该弱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60724207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com