Что хранится в Side Table в контексте управления памятью Swift (ARC)?

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

Ответ

Side Table — это скрытая от разработчика вспомогательная структура памяти, которую ARC создает для объекта, когда на него появляется слабая (weak) или невладеющая (unowned) ссылка.

Что хранится в Side Table?

  1. Счетчик слабых ссылок (weak). Отслеживает количество weak-ссылок на объект.
  2. Указатель на исходный объект. Нужен, чтобы weak-ссылка могла проверить, "жив" ли еще объект.
  3. Дополнительные флаги состояния объекта.

Как это работает?

class MyClass {}

// 1. Создается обычный объект. Side Table еще НЕТ.
var strongRef: MyClass? = MyClass() // Strong count = 1

// 2. Появляется weak-ссылка. ARC неявно создает Side Table.
weak var weakRef = strongRef // Strong count = 1, Weak count (в Side Table) = 1

// 3. Сильная ссылка обнуляется, объект уничтожается.
strongRef = nil // Strong count = 0 -> объект деаллоцируется.
               // Side Table остается, Weak count = 1, но указатель на объект обнуляется.

// 4. При обращении через weak-ссылку получаем `nil`.
print(weakRef) // nil. Side Table сообщил, что объекта нет.
               // Когда Weak count тоже станет 0, Side Table уничтожается.

Ключевая роль: Side Table позволяет weak-ссылкам безопасно становиться nil при деаллокации объекта, предотвращая краши, и является механизмом реализации unowned с проверкой на существование объекта.