Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iOS 앱의 메모리 사용량 최적화를 위한 방안과 고려 사항에 대해 설명해주세요. #9

Open
hamfan524 opened this issue Apr 1, 2024 · 3 comments
Assignees

Comments

@hamfan524
Copy link
Member

메모리 캐싱 기법(예: NSCache, 이미지 캐싱)의 개념과 iOS에서의 구현 방법을 설명해주세요.
대용량 데이터(예: 이미지, 비디오) 처리 시 메모리 최적화 방안(예: lazy loading, 썸네일 활용)에 대해 설명해주세요.

@hamfan524 hamfan524 self-assigned this Apr 1, 2024
@hamfan524
Copy link
Member Author

iOS 앱의 메모리 사용량 최적화를 위한 방안과 고려 사항에 대해 설명해주세요.

메모리 관리 방법(ARC)

  1. 메모리 관리:

    • 불필요한 객체를 즉시 해제하여 메모리 누수를 방지합니다. 강한 참조 순환을 피하기 위해 약한 참조나 비동기 메모리 해제를 사용할 수 있습니다.
    • Autorelease Pool을 적절히 활용하여 메모리 사용량을 최적화합니다.
  2. 리소스 관리:

    • 필요한 리소스만 로드하고 사용하여 메모리 사용량을 줄입니다. 미사용 리소스는 즉시 해제합니다.
    • 대용량 데이터의 경우 효율적인 로딩 및 해제 방법을 고려합니다.
  3. 메모리 캐싱 기법:

    • NSCache와 같은 캐싱 기술을 사용하여 자주 액세스되는 데이터를 메모리에 보관합니다. 이를 통해 반복적인 데이터 로드를 최소화하고 성능을 향상시킵니다.
    • 이미지 캐싱을 위해 SDWebImage, Kingfisher 등의 라이브러리를 사용할 수 있습니다.
  4. 대용량 데이터 처리:

    • Lazy Loading: 필요한 시점에 데이터를 로드하여 메모리 사용량을 최적화합니다. 특히 테이블 뷰나 컬렉션 뷰에서는 셀이 표시되기 전에 데이터를 로드하는 것이 좋습니다.
    • 썸네일 활용: 대용량 이미지나 비디오를 처리할 때는 썸네일을 사용하여 초기 로딩 시간을 단축하고 메모리 사용량을 줄일 수 있습니다.

메모리 캐싱 기법(예: NSCache, 이미지 캐싱)의 개념과 iOS에서의 구현 방법을 설명해주세요.

캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킵니다.

메모리 캐시(memory cache)

  • iOS에서는 NSCache를 통해 메모리 캐시를 관리합니다.
  • 자주 액세스되는 데이터를 메모리에 보관하여 반복적인 로딩을 최소화하고 성능을 향상시키는 기술입니다.
  • 앱이 종료되면 메모리가 해제되어 저장한 데이터가 날아갑니다.
  • 저장공간은 작지만 처리속도가 빠릅니다.

디스크 캐시(disk cache)

  • FileManager객체를 사용하여 데이터를 파일 형태로 디스크에 저장합니다.
  • 또는 UserDefaults, CoreData를 사용합니다.
  • 디스크에 파일 형태로 저장하기 때문에 앱을 종료해도 데이터가 남아 있습니다.
  • 저장공간은 많지만, 처리속도가 비교적 느립니다.

NSCache

  • NSCache는 키-값 쌍을 저장하는 컬렉션으로, 자동으로 메모리에서 해제될 수 있는 가변 크기의 객체를 보관합니다.
  • 다른 응용 프로그램에서 메모리가 필요한 경우 캐시에서 일부 항목을 제거하여 메모리 사용 공간을 최소화합니다.
  • 객체와 달리 캐시는 저장된 key 객체를 복사하지 않는 특징이 존재합니다.
  • 디폴트로 캐시 객체는 컨텐츠가 삭제되면 자동으로 제거됩니다. (변경 가능)
import UIKit

class ImageCache {
    static let shared = ImageCache()
    // NSCache 인스턴스 생성
    private let cache = NSCache<NSString, UIImage>()

    private init() {}

    // 이미지 캐싱
    func cacheImage(_ image: UIImage, forKey key: String) {
        cache.setObject(image, forKey: key as NSString)
    }

    // 이미지 가져오기
    func getImage(forKey key: String) -> UIImage? {
        return cache.object(forKey: key as NSString)
    }
}

위의 예제에서는 UIImage를 NSCache에 저장하고 관리하는 싱글톤 클래스입니다.
이미지를 캐싱하면 동일한 이미지를 다시 로드할 때 파일 시스템이나 네트워크에서 로드하는 비용을 줄일 수 있습니다.

이제 위 코드를 이용해서 이미지를 캐시하고, 캐시된 이미지가 존재하면 해당 이미지를 사용하는 코드를 보겠습니다.

import UIKit

class ImageViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 이미지 캐시에 이미지가 있는지 확인
        Task {
            if let cachedImage = await ImageCache.shared.getImage(forKey: "exampleKey") {
                // 캐시된 이미지가 있을 경우 이미지뷰에 표시
                imageView.image = cachedImage
            } else {
                // 캐시된 이미지가 없을 경우 네트워크나 로컬에서 이미지를 로드하여 캐시에 저장
                await loadImageFromNetwork()
            }
        }
    }
    
    func loadImageFromNetwork() async {
        // 네트워크나 로컬에서 이미지를 로드하여 캐시에 저장하는 예시 함수
        // 예시를 위해 임의의 이미지 URL을 사용하였습니다.
        let imageUrlString = "https://example.com/image.jpg"
        
        if let imageUrl = URL(string: imageUrlString) {
            do {
                let imageData = try await Data(contentsOf: imageUrl)
                if let image = UIImage(data: imageData) {
                    // 이미지 캐시에 이미지 저장
                    await ImageCache.shared.cacheImage(image, forKey: "exampleKey")
                    
                    // 이미지뷰에 이미지 설정
                    imageView.image = image
                }
            } catch {
                print("Error loading image:", error)
            }
        }
    }
}

viewDidLoad()에서 이미지 캐시에 저장된 이미지를 가져와서 있으면 이미지뷰에 표시하고, 없으면 loadImageFromNetwork() 함수를 호출하여 네트워크나 로컬에서 이미지를 로드하여 캐시에 저장한 후 이미지뷰에 표시합니다.

대용량 데이터(예: 이미지, 비디오) 처리 시 메모리 최적화 방안(예: lazy loading, 썸네일 활용)에 대해 설명해주세요.

  1. Lazy Loading (지연 로딩):

    • 대용량 데이터를 필요한 시점에 로드하고 보여주는 방법입니다. 예를 들어, 테이블 뷰나 컬렉션 뷰에서 셀이 스크롤될 때 이미지를 로드하는 것입니다.
    • 이를 통해 초기 로딩 시간을 단축하고 메모리 사용량을 최적화할 수 있습니다.
  2. 썸네일 활용:

    • 이미지나 비디오의 썸네일을 활용하여 초기 로딩 시간을 단축하고 메모리 사용량을 줄일 수 있습니다.
    • 대용량 이미지를 전체 크기로 로드하는 대신 작은 크기의 썸네일을 먼저 로드하여 보여줍니다.
    • 사용자가 썸네일을 선택하면 해당 이미지나 비디오를 전체 크기로 로드할 수 있습니다.
  3. 메모리 해제:

    • 사용이 완료된 데이터는 즉시 메모리에서 해제하여 메모리 누수를 방지합니다.
    • 특히 대용량 데이터를 처리할 때는 메모리 해제가 더욱 중요합니다.
  4. 압축 및 최적화:

    • 이미지나 비디오를 압축하여 파일 크기를 줄이고 메모리 사용량을 최적화할 수 있습니다.
    • 품질을 크게 손상시키지 않으면서도 압축률을 높일 수 있는 방법을 고려합니다.
  5. 페이징:

    • 대용량 데이터를 여러 페이지로 나누어 로드하는 방법입니다.
    • 페이징을 사용하면 한 번에 많은 양의 데이터를 로드하지 않아도 되므로 메모리 사용량을 최적화할 수 있습니다.
  6. 캐싱:

    • 이전에 로드한 데이터를 캐시하여 다시 사용할 수 있도록 합니다.
    • 캐싱을 통해 반복적인 데이터 로드를 최소화하고 성능을 향상시킬 수 있습니다.

@kmh5038
Copy link
Member

kmh5038 commented Apr 3, 2024

썸네일 활용: 대용량 이미지나 비디오를 처리할 때는 썸네일을 사용하여 초기 로딩 시간을 단축하고 메모리 사용량을 줄일 수 있습니다.

썸네일을 사용하면 어떤 이유로 초기 로딩 시간이 단축되나요?

@Phangg
Copy link
Member

Phangg commented Apr 4, 2024

Autorelease Pool 은 몰랐던 부분인데 알아가네요..! 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants