Swift를 개발하다보면 실행하는데는 문제가 없지만 강한참조/메모리 릭과 같은 문제는 앱 운영에 지장을 초래할수 있다.따라서 이 게시글에는 강한참조와 메모리 릭을 확인할 수 있는 도구를 알아보자.
먼저 강한참조를 어떻게 디버깅하여 찾을수 있는지 예시를 통해 알아보자.
강한참조 디버깅을 하기 위해선 DebugMemoryGraph 해당하는 버튼을 클릭하면 각 클래스마다 강한참조(Reference Count)가 생기는지 직관적으로 확인할 수 있다.
다음은 강한 참조와 관련된 예제다.
let memoCategoryVC = MemoCategoryViewController() let presentationController = memoCategoryVC.presentationController as? UISheetPresentationController presentationController?.detents = [ .medium(), ] presentationController?.prefersGrabberVisible = true // 메모리 릭나는 부분 presentationController?.delegate = memoCategoryVC self.present(memoCategoryVC, animated: true)
위 코드는 간단한 프로젝트를 진행하면서 진행한 예제의 일부이며, 본인 컴퓨터에서 PresentationController를 이용하여 prefersGrabberVisible프로퍼티를 설정하였을때 해제가 정상적으로 되지않고 강한참조가 생긴다.
(다른분들 노트북에선 위와 똑같은 코드를 작성했을때 강한참조가 일어나지 않는데 왜 내컴퓨터에서만 강한참조가 생기는지 모르겠다.)
강한 참조가 일어났을때 어떻게 확인하는 부분에 대한 글이니 presentationController관련 내용은 Skip!)
DebugMemoryGraph를 사용하여 강한참조가 일어나는 경우와 안나는 경우가 있을때 어떻게 확인하면되는지 살펴보자.
1)앱을 실행하고 Break Point를 걸어 의심이 가는 부분에 중단점을 hit 시키거나 확인하고자 하는 시점에 Debug Memory Graph 버튼을 클릭한다.
3)Debug Memory Graph를 클릭하여 아래 사진에 진입했을때 각 클래스가 (1)로 잡혀있는지 확인한다.(Reference Count는 클래스 생성시 1이 할당이 되기때문에 이는 정상적으로 작동됨)
따라서, 클래스의 Reference Count가 1이고 deinit을 print하여 정상적으로 print가 될 경우 문제가 없다.
1)deinit을 하여 print가 안나오는 class를 찾고, Debug Memory Graph 버튼을 클릭하여 해당 화면에 들어간다.
2)강한참조가 일어 날 경우 해당 클래스의 Reference Count가 1이 아닌 숫자가 증가되는것을 확인할 수 있으며 강한참조가 생기는 클래스를 클릭하여 보다 자세한 정보를 확인할수 있다.
이렇게 Xcode의 강한 참조를 쉽게 확인할 수 있는 도구인 Debug Memory Graph를 실행하면 UI를 통해 쉽고 직관적으로 확인할 수 있다.
메모리 릭을 관찰하는 도구인 Profile도 Xcode에서 제공하며, 직관적으로 확인이 가능하다.
1)Xcode에 Product - Profile 클릭
2)Leak 클릭
3)실행시 실시간으로 메모리 릭이 일어나는지 확인할수 있으며 스냅샷을 찍어 정교하게 확인할수 있다.
(Stack Trace를 통해 자세한 정보를 확인 가능)
PS. 개인적으로 Xcode에서 제공하는 메모리 관련 도구들의 UI가 VS의 메모리 관련 디버깅 툴보다 상당히 직관적이고 쉽게 파악할 수 있게 제공되는것 같아 좋다.
(물론 강한참조든 메모리 릭이든 다 파악하고 수정해야하는건 개발자 몫이지만..)
와 찢었다... 겁나 유익한 포스팅이예여!!! 잘 보고 갑니다!