我有一个带有变量子视图的视图,子视图使用描述此子视图类型的枚举来设置。我的问题是,如果以下内容会导致强大的参考周期,或者是否有更好的方法可以做到这一点:
class ControlBar: UIView {
var item = [ControlBarItemType : ControlBarItem]()
func set(with types: [ControlBarItemType]) {
for type in types {
let newItem = ControlBarItem(frame: CGRect(), type: type)
//constraints and stuff
self.addSubview(newItem)
item[type] = newItem
}
}
}
我无法将字典声明为弱字典。因此,superview将引用子视图层次结构中的每个ControlBarItem以及此类型的索引。我的理由是偶尔我需要从作为ControlBar委托的viewController更改BarItem的状态。
答案 0 :(得分:0)
不,这不会导致保留周期。
在您的情况下,有两个参考被创建
ControlBar
引用ControlBarItem
将其添加为
子视图ControlBar
引用了您的item
词典
对ControlBarItem
在这两种情况下,参考仅来自ControlBar
- > ControlBarItem
。如果有来自ControlBarItem
- >的任何引用,您只需要担心引用周期。 ControlBar
答案 1 :(得分:0)
您不创建强大的参考周期。
事实上,您有ControlBar
到每个子视图的2个强引用。这不是问题。
相反,如果你有一个从ControlBar到子视图的强引用和从子视图到ControlBar的强引用,那么你将有一个强大的参考周期。
答案 2 :(得分:0)
要有效地思考这个问题,请保持简单。寻找周期:
ControlBar保留对ControlBarItems的强引用。
所以问自己的问题是: ControlBarItem是否也保留了对其包含ControlBar的强引用?
如果答案是肯定的,那么您有一个保留周期。如果答案是否定的,那么你就不会这样做。
似乎答案是肯定的。
(详细说明:一个视图没有强烈引用它的超级视图。而且我没有看到你交付 ControlBarItem强烈引用其包含的ControlBar。如果你做了需要为ControlBarItem提供对其包含的ControlBar的引用, 是时候担心了:你要确保不强参考。)