Будет ли сильная ссылка на подпредставление в словаре вызвать цикл ссылок?
У меня есть представление с переменными подпредставлениями, подпредставления настроены с использованием перечисления, описывающего тип этого подпредставления. У меня вопрос, может ли следующее вызвать сильный ссылочный цикл или есть лучший способ сделать это:
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, у вас был бы сильный справочный цикл.
Нет, это не вызовет цикл сохранения.
В вашем случае создаются две ссылки
ControlBar
имеет ссылку наControlBarItem
от добавления его в качестве подпредставленияControlBar
имеет ссылку на вашitem
словарь, который имеет ссылку наControlBarItem
В обоих случаях ссылка идет только от ControlBar
-> ControlBarItem
, Вам нужно было бы беспокоиться только о ссылочном цикле, если бы из ControlBarItem
-> ControlBar
Чтобы думать об этом продуктивно, будь проще. Ищите цикл:
ControlBar сохраняет сильные ссылки на ControlBarItems.
Таким образом, вопрос, который нужно задать себе: сохраняет ли ControlBarItem сильную ссылку на содержащий его ControlBar?
Если ответ "да", у вас есть цикл сохранения. Если ответ "нет", то нет.
И похоже, что ответ - нет.
(Для уточнения: представление не имеет строгой ссылки на его суперпредставление. И я не вижу, чтобы вы передавали ControlBarItem сильную ссылку на содержащий его ControlBar. Если вам нужно было дать ControlBarItem ссылку на содержащий его ControlBar, это было бы время для беспокойства: вы хотели бы убедиться, что это не является сильной ссылкой.)