Создается ли Side Table для объекта, на который есть одна сильная (strong) и одна бесхозная (unowned) ссылка?

«Создается ли Side Table для объекта, на который есть одна сильная (strong) и одна бесхозная (unowned) ссылка?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, Side Table (или Side Table Record) не создается.

Почему? Side Table — это дополнительная структура памяти, которая создается для объекта только при появлении первой weak ссылки на него. Она хранит отдельный счетчик слабых ссылок (weak reference count) и другую метаинформацию, необходимую для безопасной работы weak ссылок (например, для обнуления ссылки при освобождении объекта).

Как работают strong и unowned без Side Table?

  • strong ссылка: Увеличивает обычный счетчик ссылок (retain count) в заголовке объекта.
  • unowned ссылка: Работает как "небезопасная" ссылка. Она не увеличивает retain count и не требует Side Table, но предполагает, что объект будет жить дольше, чем unowned ссылка на него. Доступ через unowned после освобождения объекта приводит к аварийному завершению (crash).

Пример:

class MyClass {}
var strongRef: MyClass? = MyClass() // retain count = 1, Side Table — НЕТ.
unowned var unownedRef = strongRef! // retain count = 1, Side Table — НЕТ.
strongRef = nil // retain count = 0, объект уничтожается.
// print(unownedRef) // CRASH: обращение к освобожденной unowned ссылке.

Side Table появится только если добавить weak var weakRef = strongRef.