> Что такое сайд таблица (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:
- Устанавливает флаг deallocating в side table
- Обнуляет все weak-ссылки через side table
- Вызывает deinit
- Освобождает память объекта
- Удаляет side table, если weak-ссылок больше нет
Если weak-ссылка обращается к объекту, она проверяет side table: если флаг deallocating установлен, возвращает nil.
На практике
Для junior-разработчика важно понимать, что weak-ссылки не бесплатны - они требуют дополнительных операций с side table. Поэтому в UIKit/Foundation циклах retain-циклов (например, delegate, closure) используют weak, но для короткоживущих объектов, где циклов нет, лучше использовать strong.
Также side table объясняет, почему weak-ссылка на объект без сильных ссылок сразу становится nil - это происходит синхронно при dealloc, а не лениво.
Пример кода
SWIFTclass MyClass {var closure: (() -> Void)?}var object: MyClass? = MyClass()weak var weakObject = objectobject?.closure = { [weak object] inprint(object == nil) // true, если объект уже deallocated}object = nil// weakObject автоматически становится nilprint(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-ссылки бесплатны - они требуют атомарных операций и дополнительной памяти
> Похожие задачи по mobile
Как реализовать unit test для функции записи данных в файл
Как реализовать функцию умножения числа на десять с обработкой символов
Как сделать потокобезопасным общий массив при синхронных операциях в concurrent очереди
Как написать структуру или класс для бинарного дерева поиска
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью