Как и где хранятся weak (слабые) ссылки в Swift?

«Как и где хранятся weak (слабые) ссылки в Swift?» — вопрос из категории Управление памятью, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

weak ссылки хранятся в отдельной таблице слабых ссылок (weak table или side table), которая поддерживается runtime. Эта таблица ассоциирована с объектом.

Принцип работы:

  1. Когда создается weak ссылка, она регистрируется в этой таблице.
  2. Когда объект деаллоцируется, 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].