Ответ
weak ссылки хранятся в отдельной таблице слабых ссылок (weak table или side table), которая поддерживается runtime. Эта таблица ассоциирована с объектом.
Принцип работы:
- Когда создается
weakссылка, она регистрируется в этой таблице. - Когда объект деаллоцируется, runtime проходит по таблице и автоматически обнуляет (
nil) всеweak-ссылки на него.
Пример:
class MyClass {}
var strongRef: MyClass? = MyClass() // Создан объект
weak var weakRef = strongRef // weak-ссылка зарегистрирована в таблице
print(weakRef) // Optional(MyClass)
strongRef = nil // Объект деаллоцируется
// Runtime обнуляет weakRef через таблицу
print(weakRef) // nil
Зачем это нужно:
weakссылки не увеличивают счетчик ссылок, что помогает избежать циклов сильных ссылок (retain cycles).- Автоматическое обнуление делает использование безопасным.
- Типичное применение: делегаты, замыкания с
[weak self].