Ответ
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?
Она создается лениво, при первой необходимости:
- При создании первой
weakссылки на объект. - При создании первой
unownedссылки на объект. - При установке 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-ссылки работают безопасно и атомарно, не мешая производительности сильных ссылок.