Ответ
Нет, 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.
Ответ 18+ 🔞
А, ну это, блядь, классика! Сейчас объясню на пальцах, чтобы даже мартышлюшка поняла.
Вот представь: ты создал объект. Обычный такой объект, без приколов. У него в голове (в заголовке) сидит счётчик сильных ссылок — retain count. Пока на него кто-то смотрит сильным взглядом (strong), он живёт, пизда. unowned ссылка — это как твой сосед-алкаш, который говорит: «Я знаю, где ты живёшь, но стучать в дверь не буду, пока ты не съедешь». Он не увеличивает счётчик, просто тычется пальцем в твою квартиру. Но если ты съехал, а он пришёл — будет пиздец, краш, в рот меня чих-пых!
И вот тут главный момент, ёпта: Side Table (или Side Table Record) — это как отдельная контора, которая открывается только тогда, когда появляется первый слабак (weak).
Пока нет слабых ссылок — нет и Side Table. Зачем? Экономия, блядь, памяти! Нехуй плодить сущности.
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 ссылке.
Видишь? Всё чисто, без лишних телодвижений. unowned просто летит в пропасть вместе с объектом, если тот умер.
А теперь, сука, волшебство:
class MyClass {}
var strongRef: MyClass? = MyClass() // retain count = 1, Side Table — НЕТ.
weak var weakRef = strongRef // ОП! Первая weak ссылка! Щас...
// ТУТ ВНУТРИ: Ага, слабая ссылка? Открываем Side Table, блядь! Записываем туда weak count и прочую хуйню.
Вот только теперь появляется эта самая Side Table — отдельная записная книжка, где ведётся учёт слабаков. И когда сильные ссылки кончаются, объект умирает, но Side Table остаётся ненадолго, чтобы всем слабакам сказать: «Ребят, объект-то сдох, идите нахуй, вот вам nil». И только потом Side Table тоже чистится.
Так что запомни: Side Table — это не для strong и не для unowned. Это исключительно сервис для weak ссылок, и включается он только по требованию. Без слабаков — живём налегке, ебать мои старые костыли.