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

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

Ответ

Side Table (также известная как Side Table Record или Weak Reference Side Table) — это скрытая от программиста вспомогательная структура памяти, которую Swift Runtime создает для некоторых объектов, чтобы безопасно управлять weak и unowned ссылками, не нарушая работу ARC для сильных ссылок.

Для чего она нужна?

Основная проблема: weak-ссылка не должна увеличивать счетчик сильных ссылок (strong retain count), но должна знать, когда объект уничтожается, чтобы обнулиться (nil). Хранить weak-указатель прямо в объекте нельзя — это сломало бы атомарность операций ARC.

Side Table решает это, отделяя "слабую" метаинформацию от основного объекта.

Когда создается Side Table?

Она создается лениво, при первой необходимости:

  1. При создании первой weak ссылки на объект.
  2. При создании первой unowned ссылки на объект.
  3. При установке associated object через objc_setAssociatedObject().

Что внутри Side Table?

  • Счетчик weak-ссылок.
  • Счетчик unowned-ссылок.
  • Указатель на исходный объект (когда объект жив).
  • Флаги состояния.

Механика работы

class MyClass {}

// 1. Объект создается, Side Table еще нет.
var strongRef: MyClass? = MyClass() // Retain count = 1.

// 2. Создается weak-ссылка -> Runtime лениво создает Side Table.
weak var weakRef = strongRef // Retain count все еще = 1.

// 3. Когда все сильные ссылки исчезают, объект деаллоцируется.
strongRef = nil // Retain count = 0 -> объект уничтожается.

// 4. Side Table остается жить. Она фиксирует смерть объекта.
// 5. При обращении к weakRef, Side Table возвращает nil.
print(weakRef) // nil
// Впоследствии Side Table также будет очищена.

Ключевые выводы

  • Side Table — это оптимизация и реализационная деталь ARC.
  • Прямого доступа к ней у разработчика нет.
  • Её существование объясняет, почему weak-ссылки работают безопасно и атомарно, не мешая производительности сильных ссылок.