티스토리 뷰

iOS

[iOS] 메모리릭 찾아내기

_dodo 2024. 4. 12. 16:17

 

 

문제 상황


프로젝트중 메모리 사용량이 계속 증가하는 현상을 보게 되었습니다.

제가 만들고 있던 것은 사용자 앨범에서 이미지를 선택하는 기능으로, 이미지를 다루기 때문에 메모리 소모가 큰 작업입니다.

따라서 이런 메모리릭은 치명적입니다.

만약 계속 인스턴스가 해제되지 않고 쌓인다면 언젠가 메모리 오버플로우로 앱이 강제종료 될 것입니다.

메모리 사용량 / 앱 동작

화면을 Dismiss해서 picker뷰를 해제했음에도 불구하고 메모리에서 사라지지 않아 새 picker를 열때마다 메모리가 증가하고 있습니다.

 

계속 반복한 결과 사용량이 2GB가 넘어가니 앱이 종료되었습니다. (아이폰 미니)

 

 

디버그툴로 릭 찾기


이제 어디서 메모리릭이 발생했는지 찾아보도록 하겠습니다.

앱을 실행시킨 후 Xcode 하단에 보시면 Debug Memory Graph 버튼이 있습니다.

이를 클릭하면 앱 동작을 일시 중단하고(인터랙션 불가) 현재 메모리 상태를 캡쳐해 사용되고 있는 인스턴스들에 대한 그래프를 보여줍니다.

 

왼쪽 인스펙터를 보시면 현재 사용되고 있는 인스턴스와 개수가 보이는데요, 여기서 어떤 객체들이 해제되지 않고 쌓이고 있는지 확인해줍니다.

제 경우엔 PhotoPickerViewController를 dismiss했는데도 7개나 존재하는걸로 봐서 여기서 문제가 생긴 것 같네요.

 

해당 객체를 더블클릭하면 오른쪽에서 해당 객체에 대한 그래프를 보여줍니다.

점 세개 더보기 버튼을 누르면 간략화되어 있는 더 많은 연관관계를 확인할 수 있습니다.

 

위에서 보시면 PhotoPickerViewController가 [capture]된 것을 확인할 수 있습니다.

이를 보고 특정 클로저에 의해 인스턴스가 캡쳐되어 순환참조로 인해 메모리가 해제되지 않고 있다는 것을 추측해볼 수 있습니다.

그리고 그 클로저는 PhotoPickerTopBar라는 객체의 onTap~~ 라는 클로저인 것 같습니다.

 

PhotoPickerTopBar의 연관관계도 살펴보니 PhotoPickerViewController가 참조하고 있네요.

이로써 순환참조때문이라는 것을 확인할 수 있습니다.

 

PhotoPickerViewController에서 UI 컴포넌트인 PhotoPickerTopBar를 생성하는 부분을 살펴보니 콜백 클로저를 전달하면서 self를 캡쳐하고 있는 것을 확인할 수 있습니다.

 

weak self를 추가해서 PhotoPickerViewController에 대한 레퍼런스 카운트가 올라가지 않도록 해주었습니다.

 

 

결과


결과적으로 위와같이 VC을 쓰지 않을때는 VC 객체가 잘 해제되어 메모리 사용량이 줄어들게 되었습니다.

메모리릭이 발생했을땐 끝없이 사용량이 증가했는데 이제 70MB를 넘지 않으면서 오르락 내리락하는 것을 확인할 수 있습니다.

 


이렇게 간단히 메모리릭을 찾아보았습니다.

Instruments나 LLDB 디버거를 통해서 더 자세히 디버깅을 할 수도 있는데, 추후엔 이 방법도 사용해봐야겠습니다.

 

 

감사합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함