Будет ли сильная ссылка на подпредставление в словаре вызвать цикл ссылок?

У меня есть представление с переменными подпредставлениями, подпредставления настроены с использованием перечисления, описывающего тип этого подпредставления. У меня вопрос, может ли следующее вызвать сильный ссылочный цикл или есть лучший способ сделать это:

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 в иерархии подпредставлений, а также на этот словарь, проиндексированный по типу. Моя причина для этого иногда мне нужно изменить состояние BarItem от viewController, который действует как делегат для ControlBar.

3 ответа

Решение

Вы НЕ создаете сильный ссылочный цикл.

Infact у вас есть 2 сильные ссылки из ControlBar к каждому подпредставлению. Это не является проблемой.

Вместо этого, если бы вы имели сильную ссылку из ControlBar на подпредставления И сильную ссылку из подпредставлений в ControlBar, у вас был бы сильный справочный цикл.

введите описание изображения здесь

Нет, это не вызовет цикл сохранения.

В вашем случае создаются две ссылки

  1. ControlBar имеет ссылку на ControlBarItem от добавления его в качестве подпредставления
  2. ControlBar имеет ссылку на ваш item словарь, который имеет ссылку на ControlBarItem

В обоих случаях ссылка идет только от ControlBar -> ControlBarItem, Вам нужно было бы беспокоиться только о ссылочном цикле, если бы из ControlBarItem -> ControlBar

Чтобы думать об этом продуктивно, будь проще. Ищите цикл:

  • ControlBar сохраняет сильные ссылки на ControlBarItems.

  • Таким образом, вопрос, который нужно задать себе: сохраняет ли ControlBarItem сильную ссылку на содержащий его ControlBar?

Если ответ "да", у вас есть цикл сохранения. Если ответ "нет", то нет.

И похоже, что ответ - нет.

(Для уточнения: представление не имеет строгой ссылки на его суперпредставление. И я не вижу, чтобы вы передавали ControlBarItem сильную ссылку на содержащий его ControlBar. Если вам нужно было дать ControlBarItem ссылку на содержащий его ControlBar, это было бы время для беспокойства: вы хотели бы убедиться, что это не является сильной ссылкой.)

Другие вопросы по тегам