Ответ
Для создания retain cycle (цикла сильных ссылок) требуется минимум два объекта, которые хранят сильные ссылки (strong) друг на друга.
Пример:
class Person {
var apartment: Apartment? // Сильная ссылка на Apartment
}
class Apartment {
var tenant: Person? // Сильная ссылка на Person
}
let john = Person()
let unit4A = Apartment()
john.apartment = unit4A
unit4A.tenant = john // Цикл создан
Почему это проблема: Даже после удаления внешних ссылок (john и unit4A из стека) счетчики ссылок объектов остаются равными 1, что предотвращает вызов деинициализаторов и приводит к утечке памяти.
Решение: Разорвать цикл, заменив одну из ссылок на weak или unowned.
class Apartment {
weak var tenant: Person? // Weak ссылка не увеличивает ARC
}