์ฐ์ ARC ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ Reference Count ์๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Swift ์ Reference Type ์ ์ธ์คํด์ค๋ ์ ์ธ์ด ๋๋ฉด Heap ์์ญ์ ํ ๋น์ด ๋ฉ๋๋ค.
Stack ์์ญ์ด ์๋๋ผ Heap ์์ญ? ์ด๋ผ๊ณ ์๋ฌธ์ด ๋ค ์๋ ์๋๋ฐ, Heap ์์ญ์ ์ค์ ์ธ์คํด์ค๊ฐ ํ ๋น์ด ๋๊ณ Heap ์์ญ์ ํ ๋น๋ ์ธ์คํด์ค์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ณ์๊ฐ Stack ์์ญ์ ํ ๋น๋ฉ๋๋ค. ์ฆ, Heap ์์ญ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๋ณ์๊ฐ Stack ์ ํ ๋น!
Referecne Count ๋ ๊ฐ๋จํ๊ฒ ์ฐธ์กฐ๋๊ณ ์๋ ์ํ (ํ์) ์ ๋๋ค. (๋ช ๋ช ์ด ์ฐธ์กฐํ๊ณ ์๋์ง!)
๋ฐ๋ผ์ Reference Type ์ ์ธ์คํด์ค๊ฐ ์์ฑ์ด ๋๋ฉด Heap ์์ญ์ ์์ฑ๋๊ณ , ํด๋น ์ธ์คํด์ค์ Referecne Count ๊ฐ 1๋ก ์ค์ ์ด ๋๋ ๊ฑฐ์ฃ .
๊ทธ๋ฆฌ๊ณ Reference Type ์ ๋ณต์ฌ (ํ ๋น) ๋ฅผ ํ ๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ณต์ฌ๋๋ ๊ฒ์ด ์๋๋ผ ์ฐธ์กฐ๋ฅผ ํ๊ธฐ ๋๋ฌธ์, ์๋ก์ด ๋ณ์๋ฅผ ์์ฑํด์ ์ธ์คํด์ค๋ฅผ ๋ณต์ฌ (ํ ๋น) ํ๊ฒ ๋๋ฉด Reference Count ๊ฐ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค!
๋ฐ๋๋ก ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ฒ ๋๋ฉด Referecount ๋ฅผ ๊ฐ์์์ผ์ผํ๊ตฌ์. (์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์๋ผ๋ฉด nil์ ์ ์ธํ ๊ฒฝ์ฐ์๋ ๋น์ฐํ Reference Count ๊ฐ ๊ฐ์)
C ์ธ์ด๋ฅผ ์ฌ์ฉํ ๋ malloc
์ ์ฌ์ฉํ์ผ๋ฉด free
๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ, ๊ธฐ์ตํ์๋์?
Heap ์์ญ์ ๋์ ์ผ๋ก ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๊ณ , ์ฌ์ฉ ํ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง๊ธฐ ์ํด ํ ๋น ํด์ ๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค!
๋ง์ฝ ํด๋น ์ธ์คํด์ค๋ฅผ ๋ ์ด์ ์ฌ์ฉํ๋ ๊ณณ์ด ์์ด Reference Count ๊ฐ 0 ์ด ๋๋ฉด ํ ๋น ํด์ ํด์ผ๊ฒ์ฃ ..?
...
๊ทผ๋ฐ ๋๊ฐ ํ๋? ARC ๊ฐ ํฉ๋๋ค.
Swift uses Automatic Reference Counting (ARC) to track and manage your appโs memory usage. In most cases, this means that memory management โjust worksโ in Swift, and you donโt need to think about memory management yourself. ARC automatically frees up the memory used by class instances when those instances are no longer needed. - ๐ Swift Documentations - ARC
ARC (Automatic Reference Counting) ๋ Swift ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ์๋์ผ๋ก, ์์์ ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํฌ๊ฒ ์ ๊ฒฝ์ ์ธ ํ์๊ฐ ์์ต๋๋ค!
์์์ ๋ณด์๋ฏ์ด, Reference Type ์ Reference Count ๋ฅผ ์ถ์ ํ๊ณ , ํ์๊ฐ ์์ด์ง๋ฉด ํ ๋น ํด์ ํด์ฃผ๋ ์ญํ ์ ํ๊ณ ์์ต๋๋ค!
ARC ์ ์ญํ ์ ๋ณด๋ฉด ๋ฐํ์์ ๋์ํ๋ ๊ฒ ์ด๋ผ๊ณ ์๊ฐ์ด ๋ค ์ ๋ ์์ง๋ง, ์ฌ์ค์ ์ปดํ์ผ ํ์์ ์คํ๋ฉ๋๋ค.
์์ Objectivce - C ๋ฅผ ์ฌ์ฉํ๋ ์์ ์๋ retain
/ release
๋ฅผ ํตํด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ์์ต๋๋ค. (MRC - Manual Reference Counting)
ARC ๋ ์ปดํ์ผ ํ์์ ์ ์ ํ ๊ณณ์ retain
, release
๋ฅผ ์ฝ์
ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ฐ๋ฐ์์ ์ธก๋ฉด์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ง์ ์๋์ผ๋ก ํ์ง ์์์ ์ข์ ์ ๋ ์์ง๋ง, ARC ๋ก ์ธํด์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ํ ์์ต๋๋ค.
๋ง์ฝ A ๋ผ๋ ์ธ์คํด์ค๊ฐ B ๋ผ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํด์ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ B ์ธ์คํด์ค๋ C ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ , C ์ธ์คํด์ค ๋ํ B ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ด๋ผ๊ณ ํ ๋, A ์ธ์คํด์ค๊ฐ ๋ชจ๋ ์์ ์ ๋๋ด๊ณ B ์ธ์คํด์ค๊ฐ ํ์๊ฐ ์์ด์ง ์ํ๊ฐ ๋์ด๋ C ์ธ์คํด์ค์ ์๋ก ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๊ธฐ๋๋ฌธ์ Reference Count ๊ฐ 0 ์ด ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง์ง ์๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๊ฐํ ์ํ ์ฐธ์กฐ (Strong Reference Cycle) ์ด๋ผ๊ณ ํ๋๋ฐ์, ๋ค์ ํฌ์คํ ์ ํตํด์ ๊ฐํ ์ํ ์ฐธ์กฐ๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค!
๐ https://velog.io/@parkgyurim/Swift-Strong-Reference-Cycle
์ค๋์ Swift์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ธ ARC ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
ํ๋ฆฐ ์ ๋ณด ๋๋ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค! ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋คโผ๏ธ