메모리 누수
프로파일링을 통해 메모리 누수 발생 확인
1. 메모리 누수 상황 1 - NSImage메모리 해제 안됨
원인 파악
프로파일링 결과, 앱의 한 사이클을 모두 돈 후, SelectFileView로 되돌아왔을때 VM에서 NSImage를 저장하는 메모리를 해제시켜주지 못하고 있음
참고
Allocation, Leak, VM Tracker 분석 결과
Allocation: 앱의 한 사이클을 다 돌고 난 후에도 CGImage가 VM영역에서 해지되지 못함
Leak: 여러가지 원인으로 메모리 누수 발생 가장 큰 부분을 차지 하는 것은 Image및 Event리스너
VM Tracker: Swift의 메모리 관리에 따라 자동으로 Dirty Size를 조절하여주고(Dirty Size감소 및 동시에 Swapped Size 증가) 이로 인해 Resident Size의 크기를 관리해주는 것을 확인
→ 이미지를 VM영역에서 해지해주어야 한다.
오류 분석
Xcode에서 제공해주는 프로파일링 툴인 Instrument를 통해 NSImage가 메모리에서 해지가 되지 않는 오류를 파악하였고, iWaver 전체 코드를 분석하여 NSImage를 사용하는 코드를 하나하나 주석처리해가며 디버깅을 진행해보았습니다.
뷰 단위로 NSImage를 저장하는 Model인 pdfImageVM을 사용하는 코드를 주석처리 후 계속 Run해보며 메모리를 관찰하여보았습니다.
현재, ImageListArea에서 filter를 사용하여 뷰에서 이미지를 보여주는 부분에서 메모리가 해제가 안되는 것을 파악하였습니다.
// MARK: 이게 원인!!!! 메모리 해제가 안됨❗️
selectedPDFImages = pdfImageVM.pdfImages.filter { pdfImages in
// 생략
}
메모리 비교
오류 해결 전 (3번의 사이클 진행) 한 사이클을 모두 돈 후, 처음 뷰로 이동하면 메모리가 해제되지 않아 계속 쌓이는 것을 확인할 수 있음. |
오류 해결 후 (3번의 사이클 진행) 한 사이클을 모두 돈 후, 처음 뷰로 이동하면 메모리가 자동으로 해제되어 감소하는 것을 확인할 수 있음 |
오류 해결
'iOS & macOS' 카테고리의 다른 글
[Swift] Profiling 방법 (0) | 2024.02.20 |
---|---|
[iOS] NearbyInteraction - NISession이 .finding에서 .found로 넘어가지 않는 문제 해결 (2) | 2024.01.13 |
[macOS] SandBox 환경에서 개발 불가능한 상황 발생 (0) | 2024.01.13 |
[macOS] 이미지가 많은 뷰 성능 최적화 - LazyVGrid (1) | 2024.01.13 |
[macOS] 파일 선택 기능 - Drag & Drop, NSOpenPanel (0) | 2024.01.12 |