Ответ
Счетчик слабых ссылок — это внутренний механизм ARC (Automatic Reference Counting), который отслеживает количество weak-ссылок на объект, не увеличивая его общий счетчик сильных ссылок (retain count).
Его назначение:
- Позволить
weak-ссылкам не удерживать объект от деаллокации. - Автоматически обнулять (
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-ссылке на объект.