ARC и сборка мусора: сравнение
Вопрос
Чем ARC в Swift отличается от сборщика мусора в Java/Kotlin, какие плюсы и минусы?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
ARC: подсчёт ссылок вставляется компилятором, освобождение детерминированное
Нет пауз сборщика и фоновых потоков, `deinit` вызывается сразу
Минус: циклы не собираются, ответственность на разработчике (`weak`/`unowned`)
Минус: атомарные retain/release стоят времени, компилятор их частично убирает
GC: собирает циклы, но паузы и выше пиковое потребление памяти
Что могут спросить следом
- Как оптимизатор уменьшает количество retain/release?
- Почему на мобильных устройствах детерминированность памяти важна?
Разбор
ARC это подсчёт ссылок, который вставляет компилятор: при копировании ссылки retain, при исчезновении release. Объект уничтожается ровно тогда, когда исчезла последняя сильная ссылка, поэтому deinit предсказуем, ресурсы освобождаются сразу, а пауз сборщика нет. Это важно на телефоне: памяти мало, и система убивает приложение за превышение лимита, а лишний пик памяти от отложенной сборки опасен. Минусы: циклы ARC не видит, их разрывает разработчик через weak и unowned. Плюс счётчики атомарные, и в горячем коде retain/release заметны в профиле, хотя оптимизатор многие пары убирает. Сборщик мусора в JVM собирает циклы сам и делает аллокации дешёвыми, но платит паузами и большим пиковым потреблением.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Как хранятся weak-ссылки в Swift
Следующий вопрос
Циклы ссылок в iOS: где возникают и как найти
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок