Вопрос проверяет понимание работы ARC и умение проектировать иерархии объектов без retain cycle.
В древовидной структуре родитель обычно владеет дочерними объектами через сильные ссылки. Дочерние объекты должны ссылаться на родителя слабо. Это разрывает циклические зависимости и позволяет ARC корректно освобождать память. Такой подход применяется во ViewController-иерархиях и Coordinator-паттерне.
При проектировании иерархий важно заранее определить, кто кем владеет. Ошибки в этом месте почти всегда приводят к утечкам памяти.
Определение:
Владелец объекта — это тот, кто отвечает за его жизненный цикл.
В древовидных структурах:
родитель владеет детьми
дети не владеют родителем
Обычно используется следующая модель:
родитель → ребенок: strong
ребенок → родитель: weak
Пример:
class Parent {
var children: [Child] = []
}
class Child {
weak var parent: Parent?
}
Такой подход используется:
в Coordinator-архитектуре
в иерархии ViewController
в композиции сервисов
Когда родитель освобождается:
массив детей удаляется
дети больше не имеют сильных ссылок
ARC освобождает всю структуру
Правильное определение владельца и использование weak-ссылок — ключ к проектированию древовидных структур без утечек памяти.