몇달 전 네이버 부스트캠프 되새김 애플리케이션을 개발하면서 사용자가 작성한 다이어리를 위치정보와 함께 저장해 맵뷰의 어노테이션(Annotation)으로 보여주도록 하는 기능을 개발하였습니다.
위의 GIF는 당시 상황을 설명하기 위해서 찍어둔 예시입니다. 맵뷰는 안그래도 메모리를 많이 사용하게 되는데, 탭바에서 다른 탭으로 이동하였음에도 맵뷰가 해제되지 않고 메모리에 그대로 남아있는 것을 볼 수 있습니다.
이 맵뷰의 메모리를 줄이기 위해서 두가지 방법을 찾았습니다.
- 맵뷰의 타입을 바꾼다.
- 탭바에서 다른 탭을 선택하게 될때마다 기존에 존재하던 맵뷰를 메모리에서 해제해준다.
맵의 타입을 바꾸기
첫번째 방법은 mapType 프로퍼티를 조작해 맵이 보여지는 방법을 조작하는 방법입니다. 예를들어 mapType을 다음과 같이 hybrid로 조절하면 맵 자체는 위성사진으로 보여지고 맵상에 표시되는 여러 태그들은 기존과 동일하게 보여집니다.
mapView.mapType = .hybrid
맵을 위성사진을 기반으로 보게 되면 기존보다 사용하는 메모리의 양이 줄어듭니다.
하지만 mapType 프로퍼티가 deprecated 될 수 있다는 경고가 나올 뿐만 아니라, 맵을 위성사진으로 바꾸는 것은 앱의 기획 측면에서 결정해야할 사항이라고 생각해서 이 방법은 사용하지 않았습니다.
맵뷰를 해제하기
두번째로 탭바에서 다른 탭을 선택할 때마다 기존에 존재하던 맵뷰를 메모리에서 해제해주는 방법입니다.
만약 해당 맵뷰를 사용하는 뷰 컨트롤러가 Navigation Controller 에 의해서 pop 되는 구조라면 그때는 뷰 컨트롤러가 deinitialize되고 메모리에서 deallocate되므로 맵뷰도 해제되어 메모리를 계속 차지하고 있지 않을 것입니다.
하지만 위의 예시 에서는 탭뷰를 사용하였기 때문에 다른 탭으로 이동한다고 해도 뷰 컨트롤러가 deinitialize 되는 것이 아니기 때문에 뷰의 생명주기 메서드를 사용해 해제해주었습니다. 그중에서 ViewDidDisappear 를 사용하였습니다.
override func viewDidDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
mapView?.removeFromSuperview()
mapView = nil
}
이제 다른 탭을 이동해도 맵뷰의 메모리가 그대로 남아있지 않고 해제되는 것을 확인할 수 있습니다.
하지만 맵뷰를 해제하면서 사용자 경험을 고민해야하는 부분이 생길 수 있습니다. 사용자가 다른 탭을 사용하다가 맵뷰로 다시 돌아오면 새로운 맵뷰를 보여주기 때문에 이전에 보던 위치를 이어서 보여주지 않습니다.
따라서 맵뷰를 해제하기 전에 지금까지 보던 좌표를 기억해두다가, 다시 돌아와서 새로운 맵뷰를 보여줄 때 중앙의 좌표를 조정해주는 과정이 추가적으로 필요해보입니다. 개인적인 의견으로는 단순한 수치만을 저장하고, 그 수치가 존재하는지 확인만 하는 작업이기 때문에 간단하게 UserDefaults 를 통해 저장하는 것이 좋다고 생각합니다.
'iOS' 카테고리의 다른 글
AnimationBackground — ABBoundingView 개발기 (0) | 2023.05.05 |
---|---|
Swift와 경쟁상황(Race Condition) (0) | 2023.05.05 |
Core Image 이용하여 이미지에 필터를 적용해보기 (0) | 2023.05.05 |
WWDC18 — Image and Graphics Best Practice (0) | 2023.05.05 |
공식문서로 UIKit공부하기: UIKit에 대해서 (0) | 2022.03.27 |