Цена копирования структур со ссылками
Вопрос
Почему структура с пятью полями-классами (или String и массивами) может копироваться заметно дороже, чем кажется?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Структура копируется глубоко: вместе с ней копируются и все объекты полей
- Копирование структур с полями-классами всегда идёт через выделение в куче
- Swift сериализует структуру при копировании, если в ней есть ссылочные поля
- Каждая копия делает retain всех ссылочных полей, а это атомарные операцииправильный ответ
Разбор
Копия структуры побитовая, но для полей со ссылками (классы, буферы Array, String, замыкания) ARC обязан увеличить счётчики, а атомарные инкременты не бесплатны в горячем цикле. Глубокого копирования объектов нет, в кучу сама копия не уходит, сериализации нет. Оптимизация: меньше ссылочных полей в горячих структурах, borrowing/consuming параметры (Swift 5.9) и вынесение редко меняющихся данных в один класс-хранилище.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Циклы ссылок в iOS: где возникают и как найти
Следующий вопрос
Почему Timer держит контроллер
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок