Ответ
Side Table — это скрытая от разработчика вспомогательная структура памяти, которую ARC создает для объекта, когда на него появляется слабая (weak) или невладеющая (unowned) ссылка.
Что хранится в Side Table?
- Счетчик слабых ссылок (
weak). Отслеживает количествоweak-ссылок на объект. - Указатель на исходный объект. Нужен, чтобы
weak-ссылка могла проверить, "жив" ли еще объект. - Дополнительные флаги состояния объекта.
Как это работает?
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 с проверкой на существование объекта.