Ответ
Side Table был введен в iOS 12 как часть оптимизации системы управления памятью (Runtime).
Проблема до iOS 12:
- Все
weak-ссылки хранились в единой глобальной хеш-таблице. - При освобождении объекта система искала все weak-ссылки на него в этой таблице, чтобы обнулить их (
nil). Этот поиск мог создавать накладные расходы.
Решение в iOS 12 (Side Table):
- Для объектов, на которые создаются
weak-ссылки, Runtime может создать Side Table — отдельную небольшую структуру, связанную с основным объектом. - В этой Side Table хранятся дополнительные данные объекта, включая список weak-ссылок на него.
- Преимущество: При освобождении объекта система обращается напрямую к его Side Table, чтобы обнулить ссылки, что значительно быстрее поиска в глобальной таблице.
Пример weak-ссылки:
class MyClass {}
var strongObject: MyClass? = MyClass() // Сильная ссылка
weak var weakReference = strongObject // Weak-ссылка (использует Side Table)
strongObject = nil // Объект уничтожается. weakReference автоматически становится nil через механизм Side Table.
print(weakReference) // Выведет "nil"
Эта оптимизация сделала использование weak-ссылок в Swift более производительным.