强引用字典中的子视图会导致引用循环吗?
Will a strong reference to a subview in a dictionary cause a reference cycle?
我有一个带有可变子视图的视图,子视图是使用描述此子视图类型的枚举设置的。我的问题是以下是否会导致强烈的参考循环,或者是否有更好的方法来做到这一点:
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
}
}
}
我无法将字典声明为弱。因此,超级视图将引用子视图层次结构中的每个 ControlBarItem 以及按类型索引的字典。我这样做的原因是偶尔我需要从充当 ControlBar 委托的 viewController 更改 BarItem 的状态。
不,那不会导致保留周期。
在您的例子中,创建了两个引用
ControlBar
引用了 ControlBarItem
将其添加为
子视图
ControlBar
引用了您的 item
词典,其中有
对 ControlBarItem
的引用
在这两种情况下,引用仅来自 ControlBar
-> ControlBarItem
。如果有来自 ControlBarItem
-> ControlBar
的任何引用,您只需要担心引用循环
您没有创建强引用循环。
事实上,您有 2 个从 ControlBar
到每个子视图的强引用。这不是问题。
相反,如果您有从 ControlBar 到子视图的强引用以及从子视图到 ControlBar 的强引用,您就会有一个强引用循环。
要有效地思考这个问题,请保持简单。寻找周期:
ControlBar 正在保留对 ControlBarItems 的强引用。
所以要问自己的问题是:ControlBarItem 是否还保留对其包含的 ControlBar 的强引用?
如果答案是肯定的,那么你有一个保留周期。如果答案是否定的,你就不会。
看来答案是否定的。
(详细说明:视图没有对其父视图的强引用。而且我没有看到你处理 ControlBarItem 对其包含的 ControlBar 的强引用。如果你did 需要为 ControlBarItem 提供对其包含的 ControlBar 的引用,那 是时候担心了:您需要确保这是 不是一个强有力的参考。)
我有一个带有可变子视图的视图,子视图是使用描述此子视图类型的枚举设置的。我的问题是以下是否会导致强烈的参考循环,或者是否有更好的方法来做到这一点:
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
}
}
}
我无法将字典声明为弱。因此,超级视图将引用子视图层次结构中的每个 ControlBarItem 以及按类型索引的字典。我这样做的原因是偶尔我需要从充当 ControlBar 委托的 viewController 更改 BarItem 的状态。
不,那不会导致保留周期。
在您的例子中,创建了两个引用
ControlBar
引用了ControlBarItem
将其添加为 子视图ControlBar
引用了您的item
词典,其中有 对ControlBarItem
的引用
在这两种情况下,引用仅来自 ControlBar
-> ControlBarItem
。如果有来自 ControlBarItem
-> ControlBar
您没有创建强引用循环。
事实上,您有 2 个从 ControlBar
到每个子视图的强引用。这不是问题。
相反,如果您有从 ControlBar 到子视图的强引用以及从子视图到 ControlBar 的强引用,您就会有一个强引用循环。
要有效地思考这个问题,请保持简单。寻找周期:
ControlBar 正在保留对 ControlBarItems 的强引用。
所以要问自己的问题是:ControlBarItem 是否还保留对其包含的 ControlBar 的强引用?
如果答案是肯定的,那么你有一个保留周期。如果答案是否定的,你就不会。
看来答案是否定的。
(详细说明:视图没有对其父视图的强引用。而且我没有看到你处理 ControlBarItem 对其包含的 ControlBar 的强引用。如果你did 需要为 ControlBarItem 提供对其包含的 ControlBar 的引用,那 是时候担心了:您需要确保这是 不是一个强有力的参考。)