class MyManager(context: Context) {
private val prefs = context.getSharedPreferences("app", Context.MODE_PRIVATE)
fun doSomething() {
// ...
}
companion object {
var instance: MyManager? = null
fun init(context: Context) {
instance = MyManager(context)
}
}
}
❓ Вопрос: что здесь не так и к чему это приведёт?
🔍 Варианты:
• a) Всё работает корректно
• b) Приложение вылетит
• c) Произойдёт утечка памяти
• d) SharedPreferences будет работать некорректно
💡 Разбор:
Если ты передаёшь
Activity как context в init(context), то:-
MyManager сохранится в companion object (по сути, глобально) - а значит,
Activity не сможет быть сборщиком мусора (GC) удалена - это и есть memory leak —
Activity остаётся в памяти навсегдаОсобенно опасно при:
• частых пересозданиях Activity (например, при смене ориентации)
• использовании этого синглтона в фоне
✅ Правильный ответ: c) Произойдёт утечка памяти
🛠️ Решение: всегда передавай `applicationContext`, если сохраняешь ссылку надолго:
fun init(context: Context) {
instance = MyManager(context.applicationContext)
}
📌
applicationContext живёт столько же, сколько и приложение, и не зависит от жизненного цикла Activity.🧠 Вывод: при создании синглтонов и долгоживущих объектов всегда думай, какой Context ты передаёшь. Это частая ошибка даже среди опытных Android‑разработчиков.