4T2F / ThinkBig2

🌟씽크빅 2팀 스터디 🌟
2 stars 0 forks source link

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

Open hamfan524 opened 7 months ago

hamfan524 commented 7 months ago

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

hamfan524 commented 7 months ago

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

메모리 관리 방법(ARC)

  1. 메모리 관리:

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

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

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

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

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

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

메모리 캐시(memory cache)

디스크 캐시(disk cache)

NSCache

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 commented 7 months ago

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

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

Phangg commented 7 months ago

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