Какое минимальное количество объектов необходимо для создания retain cycle в Swift?

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

Ответ

Для создания 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
}