Ответ
Side Table — это скрытая от программиста структура памяти, которую Swift Runtime создаёт для управления weak и unowned ссылками. Она не продлевает жизненный цикл объекта, но обеспечивает безопасную работу с ослабленными ссылками после его деаллокации.
Как это работает:
- Пока на объект есть сильные (strong) ссылки, он существует в обычной памяти.
- При создании первой weak или unowned ссылки может быть создана Side Table. Она хранит дополнительные метаданные, включая счётчик слабых ссылок.
- Когда все сильные ссылки обнуляются, сам объект деаллоцируется, но Side Table пока остаётся.
- Side Table позволяет безопасно обнулить все weak-ссылки (
nil) и корректно обработать обращение по недействительной unowned-ссылке (трап).
Пример и последствия:
class MyClass {}
var strongRef: MyClass? = MyClass() // Сильная ссылка
weak var weakRef = strongRef // Создаётся weak ссылка, может быть создана Side Table
strongRef = nil // Объект MyClass деаллоцируется.
// Side Table сохраняется, weakRef становится nil
print(weakRef) // Выведет 'nil'
Ключевые моменты:
- Накладные расходы: Side Table добавляет небольшой overhead по памяти и производительности.
- Прозрачность: Процесс автоматический, не требует вмешательства разработчика.
- Безопасность: Основная цель — предотвратить краши и неопределённое поведение при использовании weak/unowned ссылок.