TechHype
ARC в Swift: от зомби-объектов до боковых таблиц
В статье рассматривается эволюция управления памятью в Swift, в частности, системы автоматического подсчета ссылок (ARC). Автор объясняет, как ранние версии Swift управляли счетчиками сильных и слабых ссылок непосредственно в памяти объекта, что приводило к появлению «зомби-объектов» – объектов, которые были деинициализированы, но продолжали занимать память из-за наличия слабых ссылок.
Этот ранний подход имел свои преимущества, такие как простота реализации и отсутствие дополнительной косвенности при доступе к слабым ссылкам. Однако с ростом сложности приложений и увеличением числа многопоточных сценариев проявились и его недостатки. Основной проблемой стало непредсказуемое потребление памяти, когда большие объекты могли оставаться в памяти дольше, чем ожидалось, из-за сохраняющихся слабых ссылок.
Кроме того, ленивое обнуление слабых ссылок при доступе усложняло рассуждения о поведении программы в условиях одновременного доступа из разных потоков, повышая вероятность возникновения гонок данных и ошибок.
В Swift 4 и последующих версиях был внедрен новый механизм управления ссылками с использованием «боковых таблиц» (side tables). Вместо того чтобы хранить все метаданные счетчиков ссылок непосредственно в объекте, они выносятся во внешнюю структуру, которая создается только при необходимости, например, при использовании слабых ссылок.
Этот подход позволил сохранить высокую производительность для объектов, не использующих слабые ссылки, поскольку они остаются компактными и не несут лишних накладных расходов. Объекты, для которых требуются слабые ссылки, получают дополнительную структуру, что позволяет отделить время жизни объекта от времени жизни метаданных слабых ссылок.
При использовании боковых таблиц, когда последний сильный указатель на объект освобождается, объект может быть немедленно деинициализирован и его память освобождена. Боковая таблица продолжает существовать до тех пор, пока существуют слабые ссылки, обеспечивая стабильное место для их разрешения в nil.
Таким образом, переход к боковым таблицам позволил решить проблемы с управлением памятью, улучшить поведение в многопоточных сценариях и оптимизировать использование ресурсов, делая ARC в Swift более гибким и эффективным.
-
Интегрированные среды разработки3 недели назадРасширение поддержки Swift в разных IDE
-
GitHub3 недели назадRoxum IDE — среда разработки для Android
-
Новости4 недели назадВидео и подкасты о мобильной разработке 2026.15
-
Разработка4 недели назадЯ сократил время разработки Android вдвое с помощью ИИ — вот как это сделать
