Ответ
Side Table (или Side Table Record) — это отдельная структура памяти, которая создаётся для объекта, когда ему требуются слабые (weak) или невладеющие (unowned) ссылки. В ней хранится дополнительная метаинформация для управления жизненным циклом.
Типы ссылок, управляемые через Side Table:
weak(слабые) — не увеличивают счётчик ссылок (retain count). Автоматически становятсяnilпри освобождении объекта, на который указывают. Безопасны в использовании.unowned(невладеющие) — также не увеличивают счётчик ссылок, но не обнуляются. Предполагается, что объект, на который они ссылаются, будет существовать дольше или столько же, как и сама ссылка. Обращение кunownedссылке после освобождения объекта вызывает краш.
Почему это важно: Side Table позволяет реализовать безопасное поведение weak ссылок (обнуление) без изменения основного объекта. Она создаётся «лениво», только когда это становится необходимым.
Пример и сравнение:
class Service {
weak var delegate: DelegateProtocol? // Безопасная ссылка, станет nil
unowned let printer: Printer // Опасная ссылка, не обнуляется
init(printer: Printer) {
self.printer = printer
}
}
// Использование weak для избежания цикла сильных ссылок
class ViewController: UIViewController {
weak var dataProvider: DataProvider? // Цикл не образуется
}
Сильные (strong) ссылки хранятся непосредственно в объекте и увеличивают его счётчик ссылок. Они не требуют Side Table для своего базового управления.