1์ 11์ผ (ํ)
- ์คํ ๋ง์ผ ํ๋ก์ ํธ STEP 2 PR ์์ฑ
- NSCache์ด๋?
ย
[NSCache]
- ์บ์๋ฉ๋ชจ๋ฆฌ(Cache Memory)๋?
- ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ CPU๊ฐ์ ๋ฐ์ดํฐ ์๋ ํฅ์์ ์ํ ์ค๊ฐ ๋ฒํผ ์ญํ ์ ํ๋ CPU ๋ด ๋๋ ์ธ์ ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ
- ์ค์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ด์์ ๋น ๋ฅด๊ฒ ์ ๋ฌํ๊ธฐ ์ํ์ฌ ํ๋ก์ธ์๊ฐ ๋จ๊ธฐ๊ฐ์ ํ์๋ก ํ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ ๋ณด๋ฅผ ์์๋ก ์ ์ฅํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ฉ๋์ด ๋ ํฐ ์ ์ฅ์ฅ์น๋ค์ ์ฉ๋์ด ์์ ์ ์ฅ์ฅ์น๋ค๋ณด๋ค ์๋๊ฐ ๋๋ฆฐ๋ฐ ์๋์ฐจ์ด์ ๋ฐ๋ฅธ ๋ณ๋ชฉํ์์ ์ค์ด๊ธฐ ์ํ ๋ฒ์ฉ ๋ฉ๋ชจ๋ฆฌ์ด๋ค.
- ์ง์ญ์ฑ์ ์ด์ฉํ์ฌ CPU๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ํ ๊ฒ์ธ๊ฐ๋ฅผ ์ด๋์ ๋ ์์ธกํ์ฌ ์บ์๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- ์ง์ญ์ฑ(Locality)
- CPU์์ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด์ ๋งค๋ฒ Cache Memory๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋๋ฐ ์ด๋ Hit๋ฅ ์ด ์ง์ญ์ฑ์ ๊ฐ๋๋ค.
- ์ง์ญ์ฑ(Locality Of Reference)์ ํ๋ก์ธ์ค๋ค์ด ๊ธฐ์ต์ฅ์น ๋ด์ ์ ๋ณด๋ฅผ ๊ท ์ผํ๊ฒ ์ก์ธ์คํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ํ ์๊ฐ์ ํน์ ๋ถ๋ถ์ ์ง์ค์ ์ผ๋ก ์ฐธ์กฐํ๋ ๊ฒ์ ๋งํ๋ค.
- ์ง์ญ์ฑ ๋ฉ๋ชจ๋ฆฌ์ ์์น์ ์ ๊ทผ ์๊ฐ์ ๋ฐ๋ผ์ ๊ณต๊ฐ์ , ์๊ฐ์ ์ธ ํน์ฑ์ ๋ณด์ธ๋ค.
- ๊ณต๊ฐ์ ์ง์ญ์ฑ(Spatial Locality)
- ์ต๊ทผ์ ์ฐธ์กฐ๋ ์ฃผ์์ ์ธ์ ํ ๋ฐ์ดํฐ๊ฐ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ํน์ฑ
- a[0], a[1] ์ฒ๋ผ ๊ฐ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์ฐ์์ ์ผ๋ก ์ ๊ทผํ ๋ ์ฐธ์กฐ๋ ๋ฐ์ดํฐ ๊ทผ์ฒ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ ํ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ์๊ฐ ์ง์ญ์ฑ(Temporal Locality)
- ์ต๊ทผ์ ์ฐธ์กฐ๋ ์ฃผ์์ ๋ด์ฉ์ด ์ฌ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ํน์ฑ
- For, While ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ๋๋ ์กฐ๊ฑด ๋ณ์์ฒ๋ผ ํ๋ฒ ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๋ ์ ์ ํ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ์บ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋, ์ฐธ์กฐ ์ง์ญ์ฑ(๊ณต๊ฐ)์ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด ํด๋น ๋ฐ์ดํฐ๋ฟ๋ง ์๋๋ผ ์ ์ฃผ์์ ๋ฐ์ดํฐ๋ ๊ฐ์ด ๊ฐ์ ธ์ ๋ฏธ๋์ ์ฐ์ผ ๊ฒ์ ๋๋นํด์ผ ํ๋ค.
- ์บ์ ๋ฏธ์ค(Cache miss)๋?
- CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ ๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์บ์ํํธ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ํด๋น ๋ฐ์ดํฐ๊ฐ ์์ด์ DRAM์ ์ ๊ทผํด์ผ ํ๋ค๋ฉด ์บ์ ๋ฏธ์ค ๋ผ๊ณ ํ๋ค.
- ์บ์๋ฏธ์ค ์ ํ์ 3๊ฐ์ง๊ฐ ์๋ค.
- Cold start miss(Compulsory miss)
- ๋ฐ์ดํฐ์ ์ฒ์ ์ ๊ทผ ์ ์บ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฆฌ๊ธฐ ์ํด ๋ฐ์ํ๋ ์บ์๋ฏธ์ค
- Capactiy miss
- ์บ์์ ์ฉ๋์ด ๋ถ์กฑํ์ฌ ๋ฐ์ํ๋ ๋ฏธ์ค
- ์ฆ ํ๋ก๊ทธ๋จ ์ํ์ ์ ๊ทผํ๋ ๋ฐ์ดํฐ์ ์์ด ์บ์์ ์ฌ์ด์ฆ๋ฅผ ๋์ด๊ฐ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.
- ์๋ฅผ ๋ค์ด 32K direct mapped cache๋ฅผ ๋ฌ๊ณ ์๋ ์ปดํจํฐ์์ 128k array data๋ฅผ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์บ์๋ array data๋ฅผ ๋ชจ๋ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ์ฉ๋ ๋ถ์กฑ์ ์ํ ์บ์๋ฏธ์ค๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฌํ ๋ฏธ์ค๋ฅผ capacity miss๋ผ ํ๋ค.
- Conflict miss
- ์บ์ ๋ฉ๋ชจ๋ฆฌ์ A์ B ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผํ๋๋ฐ, A์ B๊ฐ ๊ฐ์ ์บ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํ ๋น๋์ด์ ๋๋ ์บ์๋ฏธ์ค.
- ์บ์๋ฏธ์ค ๋น์จ์ ๋์ฒด๋ก ํ๊ท 10% ์์ชฝ์ด๊ธฐ ๋๋ฌธ์ ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ์ปดํจํฐ ์์คํ ์ ํ๊ท ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์ ์ํฌ ์ ์์ผ๋ฉฐ, ํด๋ญ ์๋, ์ฝ์ด ๊ฐ์์ ํจ๊ป ์ปดํจํฐ ์ฑ๋ฅ์์ ๋งค์ฐ ํฐ ๋น์ค์ ์ฐจ์งํ๋ค.
- ๊ทธ๋ฌ๋ ๋ง์ ์ฌ๋๋ค์ด ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ ๋ชจ๋ฅด๋ฉฐ ์ค์ ์บ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ด ํด๋ญ ์๋๊ฐ ๋ ๋์ CPU๊ฐ ํด๋ญ์๋๋ ๋ฎ์ง๋ง ์บ์๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ CPU๋ณด๋ค ๋์ฒด๋ก ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
- Cold start miss(Compulsory miss)
- ์์ฝ
- ์บ์๋ ์ฌ์ฌ์ฉ๋ ์ ์์๋งํ ์์์ ํน์ ์์ญ์ ์ ์ฅํด๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์บ์ฑ๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ถ๊ฐ์ ์ธ ์์์ ์๋ชจํ์ง ์๊ณ caching Data๋ฅผ ๊ฐ์ ธ๋ค ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ ์ ์ฝํ ์ ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ๋ฆฌ ์๋๊ฐ ํฅ์๋๋ค.
- Caching์ ์น ๋ธ๋ผ์ฐ์ ๋ถํฐ ์น ์๋ฒ, ํ๋ ๋์คํฌ ๋ฐ CPU์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ๋ฐฉ๋ฉด์์ ์ ์ฉ๋๊ณ ์๋ค.
- iOS์์ ์บ์ฑ์ memory caching๊ณผ disk caching 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- Memory Caching
- ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ผ๋ถ๋ถ์ ์บ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ํ์ง๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด ์ด ์์ญ์ ์๋ ๋ฆฌ์์ค๋ค์ OS์ ๋ฐํ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ๋์ด์๋ ๋ฆฌ์์ค๋ค์ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
- Disk Caching
- ๋ฐ์ดํฐ๋ฅผ ํ์ผ ํํ๋ก ๋์คํฌ์ ์ ์ฅํ๋ ๊ฒ์ ๋งํ๋ค.
- ์ดํ๋ฆฌ์ผ์ด์
์ ๊ป๋ค ์ผ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์์ง๋ง, ๋์คํฌ ์บ์ฑ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์
์ด ์ฐจ์งํ๋ ์ฉ๋์ด ์ปค์ง๋ค.
- ex) ์นด์นด์คํก์์ ์ด๋ฏธ์ง๋ ๋์์์ ๋๋ฐ์ด์ค์ ์ ์ฅํ์ง ์๋๋ผ๋ ๋์ผ๋ก ๋ณด๊ธฐ ์ํด์๋ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์์ผํ๋๋ฐ, ์ด๋ ๋ค์ด๋ก๋ ๋ฐ์ ํ์ผ๋ค์ด Disk Chching๋์ด ์ฑ์ ์ข ๋ฃํ๋ค๊ฐ ์คํํด๋ ๋ณผ ์ ์๋ค.
- ํน์ด iOS์์๋ NSCache๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ์ ์ฌ์ฉ๋๋ ํด๋์ค์ด๋ค.
- NSCache
- ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ์ ์ฌ์ฉ๋๋ ํด๋์ค
- ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ์๋์ผ๋ก ์บ์๋ ๋ด์ฉ์ด ์ ๊ฑฐ๋๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์์์ด ๋ถ์กฑํด๋ ์ญ์ ๋์์ด ๋๋ค.
- NSCache๋ Thread-Safeํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ค๋ ๋์์ ์ ๊ทผํ ๋์๋ Cache์ lock์ ๊ฑธ์ด์ค ํ์๊ฐ ์๋ค.
- key-value ํํ์ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ณ ์ปฌ๋ ์ ์ ๋งํ๋ค.
- ํน์ง
- Linked List๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ํจ์จ์ ์ผ๋ก ๋์ํ๋ค. (ํ์ ์๊ฐ ๋ณต์ก๋ O(n))
- ๋ณ๋์ Dictionary๋ฅผ ๋์ด ๋ฐ์ดํฐ ์ ๊ทผ์๋ ์ฉ์ดํ๋ค (๋ฐ์ดํฐ ์ ๊ทผ ์๊ฐ ๋ณต์ก๋ O(1))
- NSDictionary์์ ์ฐจ์ด์
- ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(๊ธฐ๋ณธ ์ ๊ณต)
- ๋จผ์ NSCache๋ ์์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ ์ฐจ๋ฉด ์๋์ผ๋ก ์บ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํด์ค๋ค.
- ์ฑ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๊ฒ
- ๋ง์ฝ NSDictionary๋ฅผ Cache ์ฉ๋๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๋ ์์คํ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ ๋ ์ฌ์ ์ด ์ด์ฉํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ์์ฑํด์ผํ๋ค.
- Thread-Safe
- NSCache๋ Thread-Safeํ๊ธฐ ๋๋ฌธ์ ์บ์๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๊ณ ์ง์ธ๋๋ง๋ค ๋ฐ๋ก lock์ ํด์ค ํ์๊ฐ ์๋ค.
- ๋์์ ์ฌ๋ฌ Thread๊ฐ ์ ๊ทผํ๋๋ผ๋ ๊ฐ์ lock์ ์ก์์ค ํ์๊ฐ ์๋ค.
- ํ์ง๋ง NSDictionary๋ Thread-safeํ์ง ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๊ทผํ ๋ ๋ฐ๋ก ์ฒ๋ฆฌํด์ค์ผ ํ๋ค.
- NSCache๋ Thread-Safeํ๊ธฐ ๋๋ฌธ์ ์บ์๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๊ณ ์ง์ธ๋๋ง๋ค ๋ฐ๋ก lock์ ํด์ค ํ์๊ฐ ์๋ค.
- Retain Key
- NSCache๋ key๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ๋ฆฌํ ์ธํ๋ค.
- key๊ฐ ๋ณต์ฌ๋ฅผ ์ง์ํ์ง ์๋ ๊ฐ์ฒด์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฐ์ฒด๋ ํฌ์ฉํ๊ธฐ ์ํด์์ด๋ค.
- ๋ฐ๋ผ์ ๋ณต์ฌ๋ฅผ ์ง์ํ์ง ์๋ ๊ฐ์ฒด์๋ ์ ๋์ํ๋ค.
- ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(๊ธฐ๋ณธ ์ ๊ณต)
- NSCache Declaration
class NSCache<KeyType, ObjectType> : NSObject where KeyType : AnyObject, ObjectType : AnyObject
- NSCache Property
- Cache ๊ฐ์ฒด์๋ ๋ค์ํ ์๋ ์ ๊ฑฐ ์ ์ฑ ์ด ์์ผ๋ฉฐ ์ด๋ค์ ํตํฉํ์ฌ ์ผ๋ถ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ค.
- ์ด๋ฌํ ์๋ ์ ๊ฑฐ ์ ์ฑ ์๋ ์บ์ ๊ฐ์ฒด์ ์ต๋ ๊ฐ์๋ฅผ ์ ํํ๊ณ ๋ชจ๋ ์บ์ ๊ฐ์ฒด์ ์ต๋ cost๋ฅผ ์ ํํ๋ ๋ ๊ฐ์ง ํ๋กํผํฐ๊ฐ ์๋ค.
var countLimit: Int
- ์บ์๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋ํ์ ๊ฐ์ฒด ์
- ์ ํ๋กํผํฐ๋ฅผ ํตํด ์บ์ฑํ๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์ ํํ ์ ์๋ค.
- ๋ง์ฝ countLimit๊ฐ 10์ผ๋ก ์ค์ ๋์ด์๋๋ฐ, 11๊ฐ์ ๋ฐ์ดํฐ๋ฅผ NSCache์ ๋ฃ๊ฒ ๋๋ฉด 1๊ฐ๋ ์๋์ผ๋ก ๋ฒ๋ฆฐ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ๊ฐ์ ์ ํ์ด ์๋ค.
var totalCostLimit: Int
- ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ ์ ์บ์๊ฐ ๋ณด์ ํ ์ ์๋ ์ต๋ ๋น์ฉ
- ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ๋ cost(Int)๋ฅผ ํจ๊ป ์ค์ ํ ์ ์๋ค.
- ์ด ๋, totalCostLimit์ cost๋ค์ ์ดํฉ์ ์ต๋๊ฐ์ด๋ค.
- ์ฆ NSCache์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ๋ค์ cost๊ฐ totalCostLimit์ ๋๋ฌํ๊ฑฐ๋ ๋๊ฒ๋๋ฉด NSCache๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฐ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ๋น์ฉ ์ ํ์ด ์๋ค.
<์์> let cache: NSCache<NSString, UIImage> = NSCache() cache.countLimit // ํ์ฉํ๋ key์ ๊ฐ์ cache.totalCostLimit // cost ํฉ๊ณ์ ์ต๋๊ฐ
var evictsObjectsWithDiscardedContent: Bool
- NSCache๋ ์์คํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ์ง ์๋๋ก ๋์์ธ๋์ด ์๋ค.
- ๊ทธ๋์ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ง์ฐ๋ ๋ค์ํ ์ ์ฑ ์ ์ฌ์ฉํ๊ณ ์๊ณ , ์บ์ฑ๋ ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์คํ ์ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
protocol NSDiscardableContent
- ํด๋์ค ๋ด ๊ฐ์ฒด์ ํ์ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉ๋์ง ์์ ๋ ์ญ์ ๋์ด๋ ๋๋ค๋ฉด ์ด ํ๋กํ ์ฝ์ ์ฑํํจ์ผ๋ก์จ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๊ณต๊ฐ์ ์ค์ผ ์ ์๋ค.
func object(forKey: KeyType) -> ObjectType
- ์ฃผ์ด์ง key์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ฐํํ๋ค.
- NSDiscardableContent
- NSCache๋ ์๋์ผ๋ก ๊ฐ์ฒด์ ์บ์ฑ ๋ฐ ์ ๊ฑฐ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ ์๊ธฐ๋ฅผ ์ ์ดํ ์๋ ์๋ค.
- ๋์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ NSPurgeableData, NSDiscardableContent ํ๋กํ ์ฝ์ ์ฑํํ ํ์ ์ ์ฌ์ฉํ ์ ์๋ค.
- NSDiscardableContent๋ ํ์ํ ์๊ฐ์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ฉํด์ผํ๋ ๊ฐ์ฒด๋ฅผ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ํ๋กํ ์ฝ์ด๋ค.
- NSDiscardableContent ํ๋กํ ์ฝ์ ๋ด๋ถ์กฑ์ผ๋ก ๊ฐ์ฒด์ life cycle์ ๋ค๋ฃจ๋ Counter ๋ณ์๊ฐ ์๋ค.
- Counter ๋ณ์๋ ํ์ฌ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์์ ์ฌ์ฉ์ค์ธ์ง ์ฌ๋ถ๋ฅผ ์ถ์ ํ๋ ์ฉ๋ ์ฌ์ฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก Counter ๋ณ์๋ 1๋ก ์ด๊ธฐํ ๋๋ค.
- beginContentAccess() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด 1์ฉ ์ฆ๊ฐํ๊ฒ ๋๊ณ endContentIfPossible() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋น์์ ์ ๊ด๋ จ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ค.
- NSPurgeableData
- ํด๋น ํด๋์ค๋ ๋์ด์ ํ์ํ์ง ์์ ๋ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ฉํด์ผํ๋ mutable data ๊ฐ์ฒด์ด๋ค.
- ์ด ๊ฐ์ฒด๋ ์๋ ๋ฐ๋ฉ๋๋ ๋ฐ์ดํฐ(autopurging data)๋ฅผ ์ ๊ณตํ๋ค.
- ์ด ๊ธฐ๋ฅ์ ์ด ๊ฐ์ฒด๊ฐ ์๋์ผ๋ก ๋ฐ๋ฉ๋๋ฉด ์บ์์์๋ ์๋์ผ๋ก ์ ๊ฑฐ๋๋ค๋ ๊ฒ์ ๋งํ๋ค.
- class NSPurgeableData: NSMutableData
- ์ด ํด๋์ค๋ NSDiscardableContent ํ๋กํ ์ฝ์ ์ค์ํ๋ NSMutableData์ ์๋ธํด๋์ค๋ค
- NSPurgeableData๋ NSDiscardableContent ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ๊ตฌํ์ด ๋์ด์๋ค.
- NSPurgeableData ๊ฐ์ฒด๊ฐ NSCache์ ์ถ๊ฐ๋์๋ค๋ฉด ๋ฐ๋ฉ๋ ์ ์๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ๋ฐ๋ฉ๋๋ฉด ์๋์ผ๋ก ์บ์์์ ์ ๊ฑฐ๋๋ค.
- ๋ฐ๋ฉ๋ ์ ์๋ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ์ ๊ทผํด์ผ ํ๋ค๋ฉด, ์ฌ์ฉํ๋ ๋์ ๋ฐ๋ฉ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด beginContentAccess()๋ฅผ ํธ์ถํด์ผํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด ์ฌ์ฉ์ด ๋๋ฌ์ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ฉํด๋ ๋๋ค๊ณ ์๋ฆฌ๋ endContentAccess()๋ฅผ ํธ์ถํด์ผ ํ๋ค.
- NSCache ๊ตฌํ
- ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ ์ด์ ์ ๋ํด์ ๋ช ํํ ์์ ๋์ด ์์ง๋ ์์ง๋ง, ์บ์๋ ์ค๊ฐ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์ญ์ ํ๋ ๊ฒ์ด ๋น๋ฒํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํด(๋ฐฐ์ด๋ก ํด๋น ์์ ์ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ์์ผ๋ก ๋น๊ธฐ๊ฑฐ๋ ๋ค๋ก ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฐ์ด์ํ๋ ์์ ์ด ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋ค.) ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด๋ณผ ์ ์๋ค.
- ๋ํ NSCache๋ ๋ณ๋๋ก Dictionary๋ฅผ ๋์ด ๋ฐ์ดํฐ์ ์ ๊ทผ๋ O(1)์ ์ํํ ์ ์๋๋ก ์ ๊ณตํ๊ณ ์๋ค.
// NSCache
open class NSCache<KeyType : AnyObject, ObjectType : AnyObject> : NSObject {
private var _entries = Dictionary<NSCacheKey, NSCacheEntry<KeyType, ObjectType>>()
private var _head: NSCacheEntry<KeyType, ObjectType>?
}