В какой версии iOS была представлена оптимизация Side Table для weak-ссылок?

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

Ответ

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 более производительным.