Fragment의 LifeCycle과 뷰결합

최대환·2023년 12월 11일
0

Fragment의 LifeCycle과 뷰결합

Fragment는 Activity 내에 독립적인 화면을 가질수 있기때문에 뷰를 생성하고 파괴하는 과정을 추가로 관리한다. 따라서 Fragment에는 onCreateView()와 onDestroyView()라는 추가적인 뷰생성, 뷰파괴 단계가 라이프사이클에 존재한다.
이떄문에 뷰결합을 사용할시, 뷰가 파괴될때마다 onDestroyView()메소드에서 뷰와 관련된 모든 참조를 해제해야합니다. 이렇게 해야 메모리 누수를 방지하고, 프래그먼트가 더이상 존재하지않는 뷰를 참조하는걸 막을 수 있습니다.

그래서 공식문서에서 fragment와 뷰결합을 할때 onDestroyView에 _binding= null을 사용하는걸 볼 수 있습니다.
뷰결합 공식문서

    private var _binding: ResultProfileBinding? = null
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = ResultProfileBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }

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

실험

btn1을 눌렀을땐 BlankFragment1가 실행되는 프래그먼트를 만들고 btn2을 눌렀을땐 BlankFragment2가 실행되는 프래그먼트를 만들었다.

btn1을 누르고 btn2를 눌렀을때 onDestoryView메소드만 실행되고

뒤로가기를 눌러야 onDestoryView메소드 다음으로 onDestroy가 실행된다.

결론은 액티비티에서 뷰결합을 시킬땐 onCreate메소드에서 한다. 그리고 파괴될때는 onDestroy에서 자연스레 파괴된다.
하지만 프래그먼트는 액티비티 내에서 독립적인 화면들을 만들 수 있기때문에 추가적인 생명주기 단계가 있는데 그래서 onCreate가 아닌 onCreateView메소드에서 뷰결합을 시킨다. 그리고 파괴할때는 onDestroyView에서 뷰결합을 해제시켜준다. 그렇지않으면 재사용될때마다 뷰결합을 할수있고, 메모리 누수와같은 문제가 발생할 수도 있기때문이다.

profile
나의 개발지식 output 공간

0개의 댓글