[Android] onDestroy() → unbind의 필요와 위치

jmi·2024년 11월 26일
post-thumbnail

onDestroy란?

🔗 Android Activity 생명 주기 onDestroy

공식 문서를 참고해서 설명하자면,
onDestroy()는 안드로이드 수명 주기에서 활동이 소멸되기 전에 호출되는 콜백이다.
즉, 활동을 종료하는 마지막 수명 주기 콜백인 것이다.

onDestroy() 콜백은 이전에 해제되지 않은 모든 리소스를 해제한다. (예: Stop 콜백)


unbind

이때, onDestroy 메서드에서 unbind를 해주어야 하는데 그 이유는 다음과 같다

1. 메모리 누수(Memory Leak) 방지
: View에 대한 참조가 남아있을 경우, Activity가 파괴된 후에도 메모리가 해제되지 않을 수 있다.

2. 자원 정리
: 더이상 필요없는 자원(ViewBinding 객체)를 명세적으로 해제해, 메모리를 효율적으로 관리한다.

3. 안정성 향상
: View Destroy 이후에, 잘못된 참조로 인해 발생할 수 있는 예외 사항을 방지한다.

unbind는 ViewBinding에서 제공하는 메서드가 아니기 때문에 _binding?.unbind()보다는 _binding = null이 일반적이라고 한다.
하지만 현직자의 조언에 따르면 이 부분은 어떤 걸 사용하든 차이가 없다고도 한다


unbind와 super.onDestroy의 위치

그렇다면 onDestroy 콜백에서 unbind와 super.onDestroy 중 어떤 게 앞서야 할까?

정답 : 모든 View 참조를 먼저 제거(unbind)하고, 부모 클래스의 정리 작업(super.onDestory)을 호출해야 한다.

override fun onDestroy() {
	_binding = null
	super.onDestroy()
}

이렇게 하면 부모 클래스에서 View 참조를 시도하더라도 문제가 발생하지 않고, 메모리 누수를 방지할 수 있다.

if 순서가 반대로 된다면 어떤 문제가 발생할까?

override fun onDestroy() {
    super.onDestroy()
    _binding = null
}
  • 메모리 누수(Memory Leak)
    : 부모 클래스의 onDestory()에서 View를 참조하는 작업이 남아있다면, 이미 Destroy된 View에 접근을 시도할 수도 있다.
  • 자원 해제
    : 부모 클래스에서 실행되는 정리 작업 중, 여전히 참조가 남아있는 View에서 처리하려고 할 수 있다.

결론 : 따라서 자원을 해제하는 작업(unbind)를 먼저 수행하고, 그 다음에 부모 클래스의 정리 작업(super.onDestroy)을 호출해야 한다.

profile
안드로이드 개발자가 되자

0개의 댓글