词典中对子视图的强引用是否会导致参考周期?

时间:2016-11-18 17:28:26

标签: swift dictionary strong-references

我有一个带有变量子视图的视图,子视图使用描述此子视图类型的枚举来设置。我的问题是,如果以下内容会导致强大的参考周期,或者是否有更好的方法可以做到这一点:

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

3 个答案:

答案 0 :(得分:0)

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

在您的情况下,有两个参考被创建

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

    在这两种情况下,参考仅来自ControlBar - > ControlBarItem。如果有来自ControlBarItem - >的任何引用,您只需要担心引用周期。 ControlBar

答案 1 :(得分:0)

创建强大的参考周期。

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

相反,如果你有一个从ControlBar到子视图的强引用和从子视图到ControlBar的强引用,那么你将有一个强大的参考周期。

enter image description here

答案 2 :(得分:0)

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

  • ControlBar保留对ControlBarItems的强引用。

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

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

似乎答案是肯定的。

(详细说明:一个视图没有强烈引用它的超级视图。而且我没有看到你交付 ControlBarItem强烈引用其包含的ControlBar。如果你做了需要为ControlBarItem提供对其包含的ControlBar的引用, 是时候担心了:你要确保强参考。)