Как ARC использует счетчик слабых ссылок (weak reference count)?

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

Ответ

Счетчик слабых ссылок — это внутренний механизм ARC (Automatic Reference Counting), который отслеживает количество weak-ссылок на объект, не увеличивая его общий счетчик сильных ссылок (retain count).

Его назначение:

  1. Позволить weak-ссылкам не удерживать объект от деаллокации.
  2. Автоматически обнулять (nil) все weak-ссылки в момент, когда retain count объекта становится равным нулю и объект деаллоцируется.

Как это работает:

class MyClass {}
var strongRef: MyClass? = MyClass() // Retain count = 1
weak var observer1 = strongRef      // Weak count = 1, Retain count = 1
weak var observer2 = strongRef      // Weak count = 2, Retain count = 1

strongRef = nil // Retain count становится 0, объект деаллоцируется
// ARC автоматически устанавливает observer1 и observer2 в nil
print(observer1) // nil
print(observer2) // nil

Без этого механизма система не могла бы безопасно отслеживать, какие weak-ссылки нужно обнулить после деаллокации объекта, что привело бы к висящим указателям и крашам.

Важно: Счетчик слабых ссылок хранится в отдельной боковой таблице (side table), которая создается при первой weak-ссылке на объект.