Как технически реализованы weak-ссылки в Swift?

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

Ответ

Weak-ссылка — это ссылка, которая не увеличивает счетчик сильных ссылок (retain count) на объект и автоматически становится nil, когда объект освобождается.

Реализация "под капотом": Swift использует механизм side table (дополнительная таблица) для управления weak-ссылками. Когда создается weak-ссылка, Runtime выполняет следующие шаги:

  1. Для объекта создается или находится связанная с ним side table.
  2. В side table записывается указатель на weak-ссылку.
  3. Когда счетчик сильных ссылок объекта достигает нуля и объект деаллоцируется, 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 добавляет небольшие накладные расходы, но обеспечивает корректность и безопасность.