Какое минимальное количество объектов необходимо для создания цикла сильных ссылок (reference cycle) в Swift?

«Какое минимальное количество объектов необходимо для создания цикла сильных ссылок (reference cycle) в Swift?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для создания цикла сильных ссылок (strong reference cycle) достаточно двух объектов, каждый из которых хранит сильную ссылку на другой. Однако цикл может включать и большее количество объектов, образуя цепочку (например, A → B → C → A).

Пример цикла с двумя объектами:

class Person {
    var apartment: Apartment? // Сильная ссылка
}

class Apartment {
    var tenant: Person? // Сильная ссылка
}

let john = Person()
let unit4A = Apartment()
john.apartment = unit4A  // Person ссылается на Apartment
unit4A.tenant = john     // Apartment ссылается на Person
// Теперь john и unit4A удерживают друг друга, создавая цикл.

Почему это проблема? Объекты с циклическими сильными ссылками никогда не будут освобождены ARC (Automatic Reference Counting), что приводит к утечке памяти.

Решение: Разорвать цикл, используя weak или unowned ссылки для одного из связей.

class Apartment {
    weak var tenant: Person? // Weak-ссылка не увеличивает счетчик ссылок
}
// Теперь, когда внешняя ссылка на `john` исчезнет, оба объекта будут освобождены.