> Что такое сайд таблица (side table) в контексте weak ссылок и как она работает (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Bip.ru

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Side table - это отдельная структура данных, которую ARC использует для хранения дополнительной информации об объекте, когда её нельзя разместить в самом объекте. В контексте weak-ссылок side table хранит счётчик weak-ссылок и флаг deallocating. Когда на объект нет сильных ссылок, ARC обращается к side table, обнуляет все weak-ссылки и удаляет таблицу.

Подробное объяснение

В Swift каждый объект имеет заголовок с полями для счётчика сильных ссылок и указателя на side table. Если объекту нужны weak-ссылки или associated objects, ARC создаёт side table - отдельную запись в глобальной хеш-таблице. Сам объект хранит только указатель на неё.

Side table содержит:

  • счётчик weak-ссылок (weak count)
  • счётчик сильных ссылок (strong count), если он не помещается в заголовок
  • флаг deallocating
  • associated objects

Когда сильных ссылок не остаётся, ARC:

  1. Устанавливает флаг deallocating в side table
  2. Обнуляет все weak-ссылки через side table
  3. Вызывает deinit
  4. Освобождает память объекта
  5. Удаляет side table, если weak-ссылок больше нет

Если weak-ссылка обращается к объекту, она проверяет side table: если флаг deallocating установлен, возвращает nil.

На практике

Для junior-разработчика важно понимать, что weak-ссылки не бесплатны - они требуют дополнительных операций с side table. Поэтому в UIKit/Foundation циклах retain-циклов (например, delegate, closure) используют weak, но для короткоживущих объектов, где циклов нет, лучше использовать strong.

Также side table объясняет, почему weak-ссылка на объект без сильных ссылок сразу становится nil - это происходит синхронно при dealloc, а не лениво.

Пример кода

SWIFT
class MyClass {
var closure: (() -> Void)?
}
var object: MyClass? = MyClass()
weak var weakObject = object
object?.closure = { [weak object] in
print(object == nil) // true, если объект уже deallocated
}
object = nil
// weakObject автоматически становится nil
print(weakObject == nil) // true

Как отвечать на собеседовании

Начни с определения: side table - вспомогательная структура для хранения метаданных объекта. Затем объясни, зачем она нужна: weak-ссылки не могут храниться в самом объекте, потому что объект может быть освобождён. Опиши процесс: создание side table при первой weak-ссылке, обнуление ссылок при dealloc, удаление таблицы. Если спросят про производительность, упомяни, что weak-ссылки медленнее strong из-за дополнительного уровня косвенности.

Что проверяет интервьюер

  • Понимание ARC и жизненного цикла объектов
  • Знание разницы между strong, weak и unowned
  • Понимание, почему weak-ссылки автоматически становятся nil
  • Осведомлённость о внутреннем устройстве Swift runtime

Типичные ошибки

  • Путать side table с associated objects - это разные механизмы, хотя оба используют side table
  • Говорить, что weak-ссылки хранятся в самом объекте
  • Не упоминать, что side table создаётся лениво - только при необходимости
  • Утверждать, что weak-ссылки бесплатны - они требуют атомарных операций и дополнительной памяти

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью