Выбор ответа Junior Производительность и утечки памяти спрашивают часто обновлено

Context Activity в статическом поле

Вопрос

Почему companion object { lateinit var context: Context } с присвоением context = this в Activity опасен?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Статическое поле живёт весь процесс и держит уничтоженную Activity. Поле companion object на JVM статическое, это GC root.

Варианты ответа

  1. lateinit нельзя использовать с Context, будет ошибка при обращении
  2. Статическое поле живёт весь процесс и держит уничтоженную Activityправильный ответ
  3. Context нельзя хранить в полях Kotlin-классов, это запрещает Lint
  4. Это замедлит рекомпозицию: Compose будет отслеживать поле как состояние

Разбор

Поле companion object на JVM статическое, это GC root. После поворота или закрытия Activity объект остаётся достижимым через него и не собирается. Если нужен глобальный контекст, используют applicationContext, который живёт столько же, сколько процесс. С lateinit синтаксически всё в порядке, в Kotlin-классах Context хранить можно, если время жизни совпадает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.