seong_hye, the developer

Swift) NSCache에 대해 알아보기 본문

IOS

Swift) NSCache에 대해 알아보기

seong_hye 2022. 10. 3.

 

📘 Swift - NSCache

이미지를 활용하다보면 메모리가 걱정되게 되는데 이때 사용하게 되는 NSCache에 대해 알아보자


🔹NSCache란?

key - value 형태의 메모리 캐시를 쉽게 구현할 수 있도록 제공되는 클래스

주로 이미지나 계산 비용이 큰 데이터를 임시로 저장하고 자동으로 제거하여 성능 개선.

여러 스레드에서 동시에 접근해도 안전(Thread - safe)


🔹기본 사용 예제

let cache = NSCache<NSString, UIImage>()

// 캐시에 저장
cache.setObject(image, forKey: "example" as NSString)

//캐시에서 가져오기
if let cachedImage = cache.object(forKey: "example") {
	imageView.image = cachedImage
}

📌 NSCache<K, V>는 key와 value를 각각 참조 타입(Class)으로 요구함

 

🔍 이미지 캐싱의 경우

class ImageCache {
	static let shared = NSCache<NSString, UIImage>()
}

let urlKey = url.absoluteString as NSString

if let cachedImage = ImageCache.shared.object(forKey: urlKey) {
	imageView.image = cachedImage
} else {
	URLSession.shared.dataTask(with: url) { data, _, _ in
    	if let data = data, let image = UIImage(data: data) {
        	ImageCache.shared.setObject(image, forKey: urlKey(
            DispatchQueue.main.async {
            	imageView.image = image 
            }
        }
    }.resume()
}

🔹주요 메서드 & 속성

메서드/속성 설명
setObject(_:forKey:) 캐시에 객체 저장
object(forKey:) 캐시된 객체 가져오기
removeObject(forKey:) 특정 객체 제거
removeAllObjects() 모든 캐시 제거
totalCostLimit 총 용량 제한 설정 (예: 메모리 기준)
countLimit 저장할 객체 수 제한

🔹성능 수치 차이

상황 NSCache 사용 미사용
동일 이미지 10회 로딩 약 5 ~ 10ms (메모리 접근) 약 300 ~ 1500ms (네트워크 or 디스크 접근)
스크롤 시 리로드 부하 낮음 (이미지 캐시됨) 높음 (계속 불러옴)
CPU 사용률 낮음 높음 (디코딩 반복)
사용자 경험 부드러움, 빠름 딜레이, 깜빡임, 데이터 낭비

 

실제 사용하는 경우 ( 사용 vs 미사용 )

항목 NSCache 사용 시 사용하지 않을 시
반복 사용 속도 매우 빠름 (메모리에서 직접 조회) 네트워크 재호출, 디스크 리로드 필요
메모리 효율 자동 캐시 제거 메모리 누수 위험 (딕셔너리 등 직접 관리 시)
UI 반응성 즉시 반영 가능 (ex. 이미지) 매번 로딩 -> 딜레이/깜빡임 발생
코드 복잡도 간결 (자동 제거, 스레드 안전) 수동 캐시 관리 필요 (제한 설정 등)
앱 전체 성능 최적화 쉬움 비효율 증가, 배터리/데이터 낭비 가능

🔹NSCache vs Dictionary vs FileCache

항목 NSCache Dictionary 파일 기반 캐시
자동 제거 메모리 부족 시 제거 수동 삭제 필요 수동 관리
메모리 사용 효율적 무제한 제한 없음(디스크)
스레드 안전 O X -
휘발성 앱 종료 시 제거 휘발성임 디스크에 남음
사용 목적 이미지, 결과값 캐싱 단기 저장 장기 캐시, 오프라인 저장 등

 

Comments