0

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

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

4

3 回答 3

0

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

在您的情况下,创建了两个引用

  1. ControlBarControlBarItem从将其添加为子视图中引用了
  2. ControlBar有一个参考你的item字典有一个参考ControlBarItem

在这两种情况下,引用仅来自ControlBar-> ControlBarItemControlBarItem如果有任何引用来自-> ,您只需要担心引用循环ControlBar

于 2016-11-18T17:39:56.563 回答
0

没有创建一个强大的参考循环。

ControlBar事实上,您对每个子视图都有 2 个强参考。这不是问题。

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

在此处输入图像描述

于 2016-11-18T17:40:34.383 回答
0

要有效地考虑这一点,请保持简单。寻找循环:

  • ControlBar 保留对 ControlBarItems 的强引用。

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

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

看来答案是否定的。

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

于 2016-11-18T17:47:58.323 回答