Fragment에서 onDestroyView에서 binding 객체를 null로 설정하는 것은 메모리 누수를 방지하기 위한 중요한 관행입니다.
Fragment의 LifeCycle은 Activity의 LifeCycle과 다르며, 특히 뷰의 생성과 소멸 과정에서 차이가 있습니다.
Fragment
View 생성 => onCreateView
View 소멸 => onDestroyView
Activity
View 생성 => setContentView()
View 소멸 => onDestroy() 호출 받을때 까지 유지
Activity에서 "binding = null"을 설정하지 않는 이유
액티비티의 View 생명주기는 액티비티 자체의 생명주기와 밀접하게 동기화 되는 것이 당연합니다.
setContentView()를 통해 설정된 뷰는 액티비티가 onDestroy()를 호출 받을때까지 유지되며, 이 시점에서 액티비티 자체가 메모리에서 제거될 준비가 됩니다.
따라서 액티비티가 소멸될 때 자동으로 바인딩 객체와 관련된 뷰도 함께 가비지 컬렉터에 의해서 정리됩니다.
또한 액티비티는 일반적으로 자신의 LifeCycle동안 단일 뷰 인스턴스만 관리하기에 바인딩 객체를 null로 설정하여 명시적으로 관리할 필요가 없습니다.
메모리 누수의 원인
Fragment의 인스턴스는 onDestroyView가 호출된 후에도 계속 존재할 수 있으며,
이때 바인딩 객체는 뷰의 참조를 계속 가지고 있게 됩니다.
이러한 참조는 Fragment의 뷰가 이미 파괴되었지만,
가비지컬렉터(GC)가 뷰 객체를 회수하지 못하게 하여 메모리 누수가 의도치 않게 발생할 수 있습니다.
해결 방법
Fragment의 onDestroyView 메소드에서 바인딩 객체의 참조를 null로 설정해줍니다.
뷰에 대한 모든 참조를 제거하고, 가비지 컬렉터가 뷰 객체를 안전하게 회수할 수 있게끔 해줍니다.
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null; // 바인딩 객체 참조 제거
}
'Android' 카테고리의 다른 글
[Android] ViewPager2 - Runnable 객체로 자동으로 이미지 slide 하기 (1) | 2024.03.17 |
---|---|
[Android] View의 LifeCycle(생명주기) (0) | 2024.03.16 |
[Android] ViewBinding 총 정리 (2) | 2024.03.14 |
[Android] Android가 뷰를 그리는 방법 (0) | 2024.03.11 |
[Android] ViewPager2에 대해서 feat.RecyclerView (0) | 2024.03.10 |