Ответ
Weak-ссылка — это ссылка, которая не увеличивает счетчик сильных ссылок (retain count) на объект и автоматически становится nil, когда объект освобождается.
Реализация "под капотом": Swift использует механизм side table (дополнительная таблица) для управления weak-ссылками. Когда создается weak-ссылка, Runtime выполняет следующие шаги:
- Для объекта создается или находится связанная с ним side table.
- В side table записывается указатель на weak-ссылку.
- Когда счетчик сильных ссылок объекта достигает нуля и объект деаллоцируется, Runtime проходит по списку weak-ссылок в side table и атомарно устанавливает их в
nil.
Пример и ключевые свойства:
class MyClass {}
var strongRef: MyClass? = MyClass() // Retain count = 1
weak var weakRef = strongRef // Retain count остаётся = 1
print(weakRef) // Optional(...)
strongRef = nil // Retain count = 0, объект деаллоцируется
print(weakRef) // nil (автоматически обнулена)
Важные особенности:
- Безопасность: Процесс обнуления потокобезопасен (thread-safe).
- Optional: Weak-ссылки всегда имеют тип
Optional, так как могут статьnil. - Производительность: Использование side table добавляет небольшие накладные расходы, но обеспечивает корректность и безопасность.