본문 바로가기
iOS & macOS

[macOS] NSImage가 메모리에서 해제되지 않는 오류 해결

by Bokoo14 2024. 1. 13.

메모리 누수

프로파일링을 통해 메모리 누수 발생 확인

1. 메모리 누수 상황 1 - NSImage메모리 해제 안됨

원인 파악

프로파일링 결과, 앱의 한 사이클을 모두 돈 후, SelectFileView로 되돌아왔을때 VM에서 NSImage를 저장하는 메모리를 해제시켜주지 못하고 있음

똑같은 이슈: https://stackoverflow.com/questions/17666679/uiimageview-not-releasing-memory-according-to-vm-tracker-low-memory-warnings

참고

 

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번의 사이클 진행)
한 사이클을 모두 돈 후, 처음 뷰로 이동하면 메모리가 자동으로 해제되어 감소하는 것을 확인할 수 있음

 

오류 해결