공식문서

Making Changes to Reduce Memory Use

motosw3600 2022. 1. 17. 16:05

Making Changes to Reduce Memory Use

과도한 사용의 일반적인 원인을 해결하여 앱의 메모리 사용량 줄이기


Overview

앱의 메모리 사용량을 특정 기능이나 작업으로 localize화 할 때 메모리 사용량을 줄이기위한 변화를 할 수 있다.

과도한 메모리 사용의 일반적인 원인과 영향을 줄이기 위한 조치는 아래에 설명되어 있다.

 

Optimize Image Assets

큰 이미지, 특히 높은 컬러 depth를 가지고있는 사진은 많은 메모리를 사용한다. 앱이 보여주는 사이즈에 맞게 asset을 최적화 해라.

다른소스 (예를들어 네트워크로부터 요청한 이미지 또는 사용자의 포토 앨범에서 가져온 사진들)에서 로드된 이미지를 적절한 크기와 color depth로 변환해라. 메모리 영향을 최소화하려면 이미지 변환에 Image I/O를 사용해라. WWDC 2018 Session 416의 iOS Memory Deep Dive에서 Image I/O변환에 조언을 제공한다.

 

Reduce the Size of Core Data Transactions

Core Data는 연관된 NSManagedObjectContext가 저장될 때까지 NSManagedObject인스턴스에 대한 변경 사항을 메모리에 저장하고, 이때 부모 NSManagedObjectContext또는 영구 저장소에 변경 사항을 기록합니다. 변경사항이 영구저장소로 도달할 때까지 메모리에 저장되므로 앱이 이러한 저장공간 사이에서 돌아갈수록 core data의 작업공간이 커질 수 있다. 반대로 앱이 저장하는 빈도가 높을수록 장치의 solid-state drive에 더많은 쓰기 요청을 하고 성능에 영향을 끼치고 드라이브의 마모가 증가할 수 있다. 이 두 리소스 제약 사이의 균형을 유직하도록 앱의 지속적인 model을 디자인해야 한다.

 

Discard Unused View Objects

스크린이 잠겨있거나 앱이 백그라운드에 있을 때 유저는 너의 앱의 화면을 볼 수 없다. 이것은 이미지, 비디오, SceneKit scene 및 다른 view관련 객체들을 유지할 필요가 없다는 뜻이다. 앱이 백그라운드로 진입할 때 view관련 객체들을 해제하고 다시 포그라운드로 진입할 때 준비해라.  백그라운드 사용을 위해 앱을 준비하는 방법에 대한 자세한 설명은 Managing Your App's Life Cycle을 참고해라 

 

Eliminate Memory Leaks

메모리 leak은 할당된 메모리가 연결될 수 없거나 앱이 이 메모리의 할당을 취소할 수 없게 되었을 때 발생한다. 메모리를 해제하지 않고 할당된 메모리 포인터가 범위를 벗어나게 되면 메모리 leak이 발생할 수 있다. 앱의 객체 그래프의 retain cycle도 메모리 누수를 일으킬 수 있다. 앱이 retain cycle에서 참조를 제거하면 강한참조가 남아있어 객체가 메모리에서 해제되지 않는다.

 

Leaks profiling template을 사용해서 메모리 누수를 감지해라. Instruments는 할당되었지만 도달할 수 없는 메모리 영역을 report하기위해 앱이 사용하는 메모리를 주기적으로 스캔한다. Leaks instruments는 메모리 할당을 책임지는 코드를 보여주는 stack trace와 함께 누출된 메모리의 주소와 크기를 보여준다.

 

Remove References to Unused Objects

앱이 할당하고 액세스할 수 있지만 사용하지 않는 메모리를 가지고있을 수 있다. 사용하지않는 메모리는 앱의 기능에 기여하지 않고 leak-detection 툴과 같은 Leaks instrument에 보여지지 않고 앱의 메모리 사용을 증가시킨다.

 

예를들어 소셜 미디어 앱은 서비스로부터 메시지 리스트를 로드하고 메세지 식별자를 딕셔너리 형태로 저장할 수 있다. 사용자가 타임라인을 스크롤하면 앱이 딕셔너리에서 더 많은 메세지를 로드해서 사용자가 메세지를 탭할 때 더 많은 정보를 빠르게 표시할 수 있다. 이 딕셔너리에서 이전의 메세지를 제거하는 전략이 없으면 사용자가 스크롤할 때 경계가 없이 계속 커질 수 있다.

 

앱이 사용자가 현재 작업중인 기능을 지원하는데 필요한 개체에 대한 참조만 유지하는지 확인한다. 오래된 콘텐츠는 제거하거나 나중에 검색할 수 있도록 디스크에 저장한다. 예를들어 소셜 미디어 앱은 사용자가 해당 메세지에서 스크롤할 때 딕셔너리에서 메세지를 삭제할 수 있다.