强引用字典中的子视图会导致引用循环吗?

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 的状态。

不,那不会导致保留周期。

在您的例子中,创建了两个引用

  1. ControlBar 引用了 ControlBarItem 将其添加为 子视图
  2. ControlBar 引用了您的 item 词典,其中有 对 ControlBarItem
  3. 的引用

在这两种情况下,引用仅来自 ControlBar -> ControlBarItem。如果有来自 ControlBarItem -> ControlBar

的任何引用,您只需要担心引用循环

没有创建强引用循环。

事实上,您有 2 个从 ControlBar 到每个子视图的强引用。这不是问题。

相反,如果您有从 ControlBar 到子视图的强引用以及从子视图到 ControlBar 的强引用,您就会有一个强引用循环。

要有效地思考这个问题,请保持简单。寻找周期:

  • ControlBar 正在保留对 ControlBarItems 的强引用。

  • 所以要问自己的问题是:ControlBarItem 是否还保留对其包含的 ControlBar 的强引用?

如果答案是肯定的,那么你有一个保留周期。如果答案是否定的,你就不会。

看来答案是否定的。

(详细说明:视图没有对其父视图的强引用。而且我没有看到你处理 ControlBarItem 对其包含的 ControlBar 的强引用。如果你did 需要为 ControlBarItem 提供对其包含的 ControlBar 的引用, 是时候担心了:您需要确保这是 不是一个强有力的参考。)