Сколько будут жить объекты, помеченные Scope в Dagger

Ответ

Объекты, помеченные аннотацией @Scope в Dagger, живут столько же, сколько и компонент, к которому привязана эта область видимости. Например:

  • @Singleton — живет, пока существует ApplicationComponent (обычно весь жизненный цикл приложения).
  • @ActivityScope — живет, пока активна Activity (уничтожается при onDestroy()).
  • @FragmentScope — живет, пока существует Fragment (уничтожается при onDestroy()).

Пример:

@Module
class AppModule {
    @Singleton
    @Provides
    fun provideHeavyDependency(): HeavyDependency = HeavyDependency()
}

Здесь HeavyDependency будет существовать, пока живет ApplicationComponent.

Ответ 18+ 🔞

А, ну это же про Dagger и его скопы! Ёпта, вечная тема для путаницы, но на самом деле всё проще пареной репы, если разобраться.

Смотри, представь, что твой компонент — это такой большой барак, а объекты в нём — это жильцы. Аннотация @Scope — это просто бумажка на двери, которая говорит, сколько этот жилец может тут продержаться. Пока барак стоит — жилец живёт. Барак разобрали — все, кто в нём был, на выход.

Вот смотри на классику:

  • @Singleton — это дед, который поселился в главном, ApplicationComponent. Этот барак-приложение сносится только когда ты весь апп целиком закрываешь. Вот пока апп живёт — и дед живёт. Удобно для всякой тяжёлой хуйни, которая нафиг не нужна каждый раз создаваться заново.
  • @ActivityScope — это уже сосед по квартире в бараке ActivityComponent. Активность уничтожили (onDestroy()), барак снесли — соседа, вместе со всеми его зависимостями, нахуй выкинули, память почистили.
  • @FragmentScope — ну это вообще мелкий, живёт в своей каморке FragmentComponent. Фрагмент приказал долго жить — и вся его мелочёвка, помеченная этой скопой, отправилась в digital-небытие.

Вот тебе пример, чтобы вообще всё стало ясно, как божий день:

@Module
class AppModule {
    @Singleton
    @Provides
    fun provideHeavyDependency(): HeavyDependency = HeavyDependency()
}

Видишь? HeavyDependency помечен как @Singleton. Это какой-нибудь здоровенный клиент ретрофита или база данных. Создали его один раз, когда ApplicationComponent собрали, и он теперь будет жить, пока жив сам компонент приложения. То есть, практически, всегда. Это чтобы он не создавался, как дурак, на каждый чих, а то жрёт ресурсов — овердохуища.

Короче, правило простое, как три копейки: срок жизни объекта = срок жизни компонента, в котором он зарегистрирован. Привязал зависимость к скопе активити — получил её на всю жизнь активити и ни минутой дольше. Всё гениальное — просто, ёпта. Главное — не навешивай @Singleton на то, что должно жить только пока экран открыт, а то будет тебе не оптимизация, а манда с ушами, которая память жрёт просто зазря.