[Swift3.0]iOS·tvOS 앱으로 이미지를 다룰 때는 UIImage 캐시에 요주의
메모리 사용량이 격증! ?
tvOS와 iOS에 대응한 우키요에 시계 앱을 개발하고 있을 때, 메모리 사용량이 점점 늘어나는 현상이 일어나서 곤란했습니다.
메모리 누수를 하는 것은 아닌데 왜일까? 라고, 여러가지 조사해 보면, 이쪽의 기사를 만났습니다.
UIImage using contentsOfFile - stack overflow
분명히 UIImage(named: )를 사용하면 이미지가 자동으로 캐시됩니다.
애플의 문서도 조사해 보면, 이렇게 써 있었습니다.
Use the init(named:in :compatibleWith:) method (or the init(named:) method) to create an image from an image asset or image file located in your app's main bundle (or some other known bundle). Because these methods cache the image data automatically, they are especially recommended for images that you use frequently.
캐시를 원하지 않을 수도 있습니다.
자주 액세스하는 이미지라면 자동으로 캐시해 주면 읽기가 빨라지기 때문에 고맙습니다.
그러나, 우키요 그림 시계 앱은, 200장 근처의 우키요 그림 읽어 갑니다. 그것을 전부 캐싱하는 것이기 때문에, 우키요에를 하나 표시하면, 사용 메모리가 300MB 정도가 되어 버렸습니다.
2주째부터는 캐시가 부족해서 사용 메모리가 늘어나지 않지만 얼마든지 300MB나 메모리를 사용하는 것은 모바일 앱으로는 곤란했어요. 게다가 앞으로의 업데이트로 우키요에 이미지를 추가하면 그 때마다 사용 메모리가 늘어나게 됩니다.
캐시하지 않는 방법
그렇다면 자동으로 캐시를 원하지 않는 경우 어떻게해야합니까?
한층 더 애플의 문서를 조사해 보면(자), 캐쉬를 하지 않는 경우는 UIImage(contentsOfFile: )를 사용해, 라고 써 있습니다.
Use the imageWithContentsOfFile: or init(contentsOfFile:) method to create an image object where the initial data is not in a bundle. These methods load the image data from disk each time, so you should not use them to load the same image
코드를 다시 쓰고 실제로 시도하면 확실히 캐시되지 않은 것 같아서 사용 메모리가 점점 늘어나는 일은 없어졌습니다.
이것으로 방반자이인 것 같지만, 하나만 곤란한 적이 있습니다.
그것은 contentsOfFile을 사용하면 asset 카탈로그를 사용할 수 없습니다.
앱의 구조로서, asset 카탈로그를 잡지 않아서 곤란한 일은(지금은) 없습니다. 그러나 Xcode로 이미지를 관리하기 쉽기 때문에 asset을 사용하고 싶습니다. 하지만 그것이라면 메모리를 담아 버린다.
라고 하는 딜레마로 고민했습니다만, 배에 배는 갈 수 없습니다.
어쩔 수 없으므로 images 폴더를 만들고 그 안에 이미지 파일을 넣기로 결정했습니다.
따라서 많은 이미지를 사용하는 앱을 개발할 때는 UIImage 캐시에 주의해야 합니다.
Reference
이 문제에 관하여([Swift3.0]iOS·tvOS 앱으로 이미지를 다룰 때는 UIImage 캐시에 요주의), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/toshi586014/items/7e5294efdfc1b3c55ae2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)