Android

[Android] Fragment에서 Binding 객체를 null로 설정해야 하는 이유

도우 2024. 3. 15. 02:52
반응형

 

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; // 바인딩 객체 참조 제거
}

 

 

반응형