Вопрос проверяет понимание механизма автоматического управления памятью в Swift через подсчёт ссылок.
ARC отслеживает количество ссылок на каждый экземпляр класса и автоматически освобождает память, когда счётчик ссылок становится равным нулю. При присвоении ссылки счётчик увеличивается, при выходе ссылки из области видимости — уменьшается. Это позволяет разработчику не заботиться явно об освобождении памяти, пока не возникают циклы сильных ссылок.
Принцип работы ARC:
Для каждого объекта класса Swift поддержит счётчик сильных ссылок.
При создании ссылки (let a = Obj()) счётчик увеличивается.
При обнулении ссылки (a = nil) счётчик уменьшается.
Увеличение и уменьшение счётчика:
Увеличивается при присвоении новой переменной или при передаче объекта в функцию.
Уменьшается при выходе переменной из области видимости или при присвоении nil.
Освобождение памяти:
Когда счётчик достигает нуля, вызывается деструктор deinit() и память освобождается.
Пример:
class Person {
let name: String
init(name: String) { self.name = name }
deinit { print("\(name) deallocated") }
}
var p1: Person? = Person(name: "Alice") // count = 1
var p2 = p1 // count = 2
p1 = nil // count = 1
p2 = nil // count = 0 → deinit вызываетсяARC автоматически управляет памятью для классов без ручного free или delete. Важно понимать, как ссылки влияют на счётчик, чтобы избегать утечек через циклы сильных ссылок.