맛동산이

Swift) NSCache와 NSDictionary 본문

앱/Swift

Swift) NSCache와 NSDictionary

진ddang 2023. 9. 7. 04:54

Cache

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

-위키피디아-

memory 와 filemanager

  • in memory 방식은 데이터의 읽기 성능을 높이기 위해서 DB와 같은 저장소에서 빠르게 가져올수 있는 메모리에 데이터를 올려두는 방식이다.
  • Filemanager 방식은 파일 매니저를 이용하여 데이터를 파일 형식으로 디스크에 저장한다.
  • 두개의 차이는 앱을 종료 해도 데이터가 남는지의 차이이다.

당연히 메모리는 날라가고, 파일로 저장된건 영구저장

swift에서는 in memory는 nscahce이며, filemanager는 userdefaults방식이다.

userdefaults는 in memory 이지만, 동기화를 통해서 filemanager를 통해 저장하는 방식

let defaults = Userdefaults.standard
defaults.set("hi", forKey: "sayhi")
defaults.synchronize() -> //동기화를 통해 filemanager로 영구저장

NSCache

Untitled.png

NSCache는 mutable(가변) 콜렉션이며, key-value 방식으로 일시적으로 저장되는 콜렉션이다. 메모리가 부족하면, 제거될 가능성이 존재한다.

NSCache key 는 값을 복사하지 않고 참조한다.

NSCache는 key와 value에 NSObject,

즉 클래스 인스턴스만 올수있기 때문에, 복사를 지원하지 않는 타입도 키와 벨류로 올수 있다.

NSCopying

깊은 복사와 얕은 복사

  • 깊은 복사는 메모리에 새로운 인스턴스를 생성
  • 얕은 복사는 참조를 하는것이다.

nscopying은 프로토콜로 참조 타입의 데이터를 깊은 복사가 가능하도록 하는 프로토콜이다.

  • NSDictionary는 NSCopying을 채택하고 있다.
  • 따라서 깊은 복사만을 할수 있다. → 차이점

COW(copy on write)

cow는 위에서 언급했던, 깊은복사와 관련이 있다.

기능적으로 깊은복사는 인스턴스를 새로이 생성하는것이기 때문에 메모리가 많이 드는데, 이때 array와 딕셔너리 같은 타입이라면 엄청나게 많은 메모리를 사용할수도 있다.

이때 cow를 사용한다.

cow란, 복사가 발생한 직후에는 얕은 참조를, 해당 데이터가 변경될때는 깊은 참조를 하게 되는것이다.

NSCache는 Thread -safe

NSCache는 NSLock이라는 객체를 사용해서 데이터를 삽입 삭제한다.

따라서 thread -safe 하게 사용가능하다.

NSDictionary는 불가능 (thread -safe 하지 않다. )

NSCache와 NSDictionary 차이

  1. thread -safe에서 차이가 난다. (NSCache는 safe, NSDictionary는 not safe)
  2. NSCache는 key-value둘다 클래스로 파라미터를 받기 때문에, 참조이며, NSCopying을 채택한 타입이 오지 않아도 된다. (NSDictionary는 아님)
  3. NSCache는 NSLock을 사용해서 데이터를 변경하기 때문에 불필요한 연산이 발생한다. (싱글스레등에서는 NSDictionary가 유리 할수도 있음)
반응형