Какие проблемы с памятью предотвращает ARC (Automatic Reference Counting)?

«Какие проблемы с памятью предотвращает ARC (Automatic Reference Counting)?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ARC автоматически управляет памятью для экземпляров классов, предотвращая две основные проблемы:

  1. Утечки памяти (Memory Leaks): Объект должен быть освобожден, но остается в памяти из-за оставшихся сильных ссылок. ARC освобождает память, когда счетчик сильных ссылок на объект становится равным нулю.
  2. Висячие указатели (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 ссылки.