지금까지 Activity 혹은 Fragment에서 Lifecycle 콜백 메소드를 사용할 때,
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
항상 이렇게 super.onXxx() 메소드를 호출한 다음, 내가 진행할 작업을 하였다. super.onXxx() 메소드와 내가 진행하는 작업에 대해 순서를 신경쓰지 않았는데, 이렇게 작성하면 문제가 발생할 가능성이 있다는 것을 이번에 알게 되었다.
onCreate(), onStart(), onResume() 단계에서는 부모 클래스의 로직을 먼저 실행해야 한다. 예를 들어, 부모 클래스(예: BaseActivity)의 onCreate() 메소드에서 객체를 생성했는데, 자식 클래스에서 super.onCreate() 이전에 해당 객체를 참조하는 작업을 한다면 NPE가 발생할 수도 있다.
이와 반대로 onPause(), onStop(), onDestroy() 단계에서는 자식 클래스의 로직을 먼저 진행하는 것을 권장한다. 생성 단계에서 했던 것과 반대로 생각하면 된다. 예를 들어 부모 클래스의 onDestory()에서 객체를 null로 초기화하는 작업을 하였는데, 자식 클래스에서 super.onDestory()를 먼저 호출하면 그 밑의 코드에서도 Exception이 발생할 수 있다.
Activity의 Lifecycle 콜백 메소드를 예시로 들었지만, Fragment에서도 마찬가지라고 생각하면 된다.
// 수정 후
override fun onDestroyView() {
binding = null
super.onDestroyView()
}
멘토 분께서는 Stack 자료구조처럼 먼저 들어간 데이터가 가장 나중에 pop되는 FILO 방식처럼 생각하라고 하셨다.