Какие типы ссылок хранятся в Side Table в ARC (Swift)?

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

Ответ

Side Table (или Side Table Record) — это отдельная структура памяти, которая создаётся для объекта, когда ему требуются слабые (weak) или невладеющие (unowned) ссылки. В ней хранится дополнительная метаинформация для управления жизненным циклом.

Типы ссылок, управляемые через Side Table:

  1. weak (слабые) — не увеличивают счётчик ссылок (retain count). Автоматически становятся nil при освобождении объекта, на который указывают. Безопасны в использовании.
  2. unowned (невладеющие) — также не увеличивают счётчик ссылок, но не обнуляются. Предполагается, что объект, на который они ссылаются, будет существовать дольше или столько же, как и сама ссылка. Обращение к unowned ссылке после освобождения объекта вызывает краш.

Почему это важно: Side Table позволяет реализовать безопасное поведение weak ссылок (обнуление) без изменения основного объекта. Она создаётся «лениво», только когда это становится необходимым.

Пример и сравнение:

class Service {
    weak var delegate: DelegateProtocol? // Безопасная ссылка, станет nil
    unowned let printer: Printer // Опасная ссылка, не обнуляется

    init(printer: Printer) {
        self.printer = printer
    }
}

// Использование weak для избежания цикла сильных ссылок
class ViewController: UIViewController {
    weak var dataProvider: DataProvider? // Цикл не образуется
}

Сильные (strong) ссылки хранятся непосредственно в объекте и увеличивают его счётчик ссылок. Они не требуют Side Table для своего базового управления.