본문 바로가기
iOS_Swift

(Swift iOS) 메모리가 늘어나는 현상.. 줄어들질 않는다_Kingfisher

by DevJake 2020. 10. 29.

일단 결론부터 말하면, 원인을 찾았다 ㅠㅠ

뭐 다른거 하다가 차차 알게 되었지만, 왜 이러지? 라는 의문을 품은지 거의 두달만에 찾았다. 

현상은 이렇다. 

초기 메모리 사용량 77.5M

이건 처음 진입 화면이다. 기본이 77.5M 정도 되는데, 

여기서 선수 검색화면 즉, 테이블뷰를 이용하는 화면으로 넘어가서, 

'독일' 을 검색하면 독일 선수들로 테이블뷰가 다시 reload 된다. 

자자 여기까진 그렇다고 치자 

메모리 사용량이 늘었다. 

검색하면 검색할수록 조금씩 조금씩 메모리가 늘어난다. 

뭐 그럴수 있다. 근데 문제는....

이 화면에서 나가고 초기 화면으로 돌아갔는데도 불구하고, 

한숨..

메모리가 안떨어진다. 

 

일단, 앱 개발 초기에 있었던 문제로 View를 이동하면 이동할수록 메모리가 계단식으로 늘어나는 문제가 있었다. 

멋모르고 View 이동할때 아래와 같은 코드를 썼었는데 

알고보니, 이건 기존 View를 없애고 다른 View로 넘어가는 게 아니라, 기존 View 위에 다른 View를 덮어 씌워주는 거였다. 

 

초기 로그인화면에서 한번정도 로그인 완료 된 후 화면으로 넘어갈때 쓰는것은 괜찮으나.. 일반 뷰이동시 썼다가 메모리가 순환으로 늘어나는 걸 경험한 후, 모든 View 이동시 코드는 Present - Dismiss 로 바꿔 주었다. 

이런 코드나
이런 코드로....

그 이후 View 이동으로 인한 메모리 증가 문제는 없었다. 

 

다시 맨 위의 주제로 돌아가서.. 

저 문제를 없애기 위해 여러가지 시도를 해 보았다. 

View 사라질때, Data 담는 그릇 인위적으로 초기화 시키기
변수란 변수에 죄다 weak 달기

weak 는 해당 화면에서 떠나면 스위프트에서 알아서 적절히 메모리 해제를 하도록 도와준다고 해서 해봤는데.. 

weak 의 기능은 잘 작동하겠지만, 찾고있는 메모리 문제에 대한 해답은 아니었다. 

 

문제의 원인은 바로 이놈이었다. 

킹피셔!!!!!!!

아주아주 고마운 라이브러리인 KingFisher인데, 이녀석일줄은 몰랐다.

모든 테이블 뷰에 띄우는 사진을 KingFisher를 통해 출력시키고 있었는데, 

 

이 녀석의 메인 기능이...

''비동기 이미지 다운로드 및 캐싱"

캐싱... cache... 그거였다.

 

한번 띄웠던 이미지는 캐시에 저장해서 나중에 다시 불러올때 써먹을수 있도록 하는 아주아주 고마운 기능인데, 

내 경우에는

수십, 수백명의 선수 사진을 출력하면서 고이고이 캐시에 모셔두고 있었던 거였다. 

 

그럼, 해당 테이블뷰에서 떠날때, 캐시만 지워주면 되는거다. 

View 닫을때 KingFisher에 저장된 모든 메모리, 디스크 캐시 삭제

 

아 이 아름다운 하강곡선!

아.. 책장 뒤에 쌓여있던 먼지 싹 다 치워버린듯한 상쾌함.

 

하지만, 캐시 지워주는 기능을 본 앱에 반영하지는 않았다. 

 

KingFisher 문서에 따르면, 메모리가 어느 정도 차서 Warning이 발생하면, 

알아서 KingFisher에서 캐시를 지워준다고 한다. 그리고 어차피 앱이 재시작되면, KingFisher에 저장된 캐시는 모두 초기화 되므로...

 

혹시라도 운영중에 메모리 문제로 충돌, 앱이 강제종료 되는 사례가 있으면 그 때 코드를 넣어도 나쁘지 않을 거라 생각한다. 

 

 

댓글