Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- error
- 고차함수
- array
- self
- NotificationCenter
- segue
- SWIFTUI
- ScrollView
- 글또
- viewlifecycle
- class
- Refresh
- Git
- Observer
- singleton
- list
- Animation
- http
- Switch
- mvvm
- struct
- protocol
- SWIFT
- uikit
- PushNotification
- escaping
- IOS
- 화면전환
- calendar
- apns
Archives
- Today
- Total
seong_hye, the developer
Swift) NSCache에 대해 알아보기 본문
📘 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 | - |
휘발성 | 앱 종료 시 제거 | 휘발성임 | 디스크에 남음 |
사용 목적 | 이미지, 결과값 캐싱 | 단기 저장 | 장기 캐시, 오프라인 저장 등 |
'IOS' 카테고리의 다른 글
Swift) 문법정리 - 확장(Extension) (0) | 2022.10.18 |
---|---|
Swift) Firebase에 대해서 알아보기 (0) | 2022.10.10 |
Swift) Lottie 애니메이션 사용해보기 (0) | 2022.09.22 |
Swift) Kingfisher에 대해 알아보기 (0) | 2022.09.20 |
Swift) Cocoapods에 대해 알아보자 (0) | 2022.08.02 |
Comments