Ответ
Для создания цикла сильных ссылок (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` исчезнет, оба объекта будут освобождены.