Ответ
Weak ссылка из Side Table указывает на сам объект (heap-объект), за которым она наблюдает.
Механизм работы:
- Когда создается первый
weakreference на объект, для него создается отдельная структура — Side Table. - Side Table хранит:
- Счетчик слабых ссылок (
weakref count). - Указатель на исходный объект.
- Счетчик слабых ссылок (
- Сама
weakпеременная содержит указатель не напрямую на объект, а на эту Side Table.
Что происходит при освобождении объекта?
- Когда счетчик сильных ссылок (
strongref count) объекта достигает нуля, объект деаллоцируется. - Side Table обнуляет свой указатель на этот объект.
- Все
weakпеременные, ссылающиеся на Side Table, начинают возвращатьnil.
Пример и результат:
class MyClass {}
var strongRef: MyClass? = MyClass() // Strong ref count = 1
weak var weakRef = strongRef // Создается Side Table
strongRef = nil // Strong ref count = 0 -> объект уничтожается
print(weakRef) // nil (Side Table обнулила указатель)
Итог: Side Table — это посредник, который позволяет безопасно обнулять weak ссылки, предотвращая висячие указатели.