Ответ
ARC автоматически управляет памятью для экземпляров классов, предотвращая две основные проблемы:
- Утечки памяти (Memory Leaks): Объект должен быть освобожден, но остается в памяти из-за оставшихся сильных ссылок. ARC освобождает память, когда счетчик сильных ссылок на объект становится равным нулю.
- Висячие указатели (Dangling Pointers): Попытка обращения к объекту, который уже был освобожден. ARC гарантирует, что объект не будет освобожден, пока на него есть хотя бы одна сильная ссылка.
Пример работы ARC:
class User {
let name: String
init(name: String) { self.name = name; print("(name) создан") }
deinit { print("(name) уничтожен") }
}
var ref1: User? = User(name: "Alice") // Счетчик ссылок (RC) = 1
var ref2: User? = ref1 // RC = 2 (новая сильная ссылка)
ref1 = nil // RC = 1
ref2 = nil // RC = 0 -> Срабатывает deinit, память освобождается
// Вывод: "Alice создан" -> "Alice уничтожен"
Что ARC НЕ предотвращает:
- Циклы сильных ссылок (Strong Reference Cycles): Когда два объекта удерживают друг друга сильными ссылками, их RC никогда не станет нулевым. Для решения используются
weakилиunownedссылки.