- Published on
๐ Swift - ARC(strong, weak, unowned)
- Authors
- Name
- ์ด์ฐฝ์ค
Swift ๋ฌธ์์๋ ์ค๋๋ง์ด๋ค์. ์ต๊ทผ ํ์ด์ฌ๋ง ๋ค๋ฃจ๋ค๋ณด๋ Swift ์ชฝ ๋ฐ๋ฆฐ ๊ณต๋ถ๊ฐ ์ฐ๋๋ฏธ์์.
์ค๋์ ARC์ ๋ํด ์์๋ณผ๊ฒ๋๋ค. ์ด์ผ๊ธฐ๋ ๊ณ์ ๋ค์ด์๊ณ ์ฐธ๊ณ ํ๋ ์ฝ๋๋ค์์๋ ๋งค์ฐ ์์ฃผ ๋ณด์๋๋ฐ ์ด๋ฒ์ ์ ๋๋ก ์์๋ณด๊ณ ๊ฐ๋ด์ผ๊ฒ ์ต๋๋ค.
ARC (Automatic Reference Counting)
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ARC๋ ์ฐธ์กฐ์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณด๊ธฐ๋งํด๋ ๊ธฐ๋ถ์ด ์ข์์ง๋ Automaticํ ๊ธฐ๋ฅ์ ๋๋ค.
ํ ๋ง๋๋ก ์ฝ๊ฒ ๋๊ธฐ๋ฉด ARC๋
์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ์์ฃผ ๊ฐํธํ ๊ธฐ๋ฅ์ ๋๋ค.
์ฌ๊ธฐ์ ์กฐ๊ธ ๋ ๋ค์ด๊ฐ๋ฉด ARC๋,
์ปดํ์ผ ํ์์ ์๋์ผ๋ก
retain
,release
์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. retainํ ํ์๋ฅผ ์ถ์ ํ๋ฉฐ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ์ธ์คํด์ค๋ฅผ releaseํด์ฃผ๋ ๊ฒ ์ด๋ผ๊ณ ์ค๋ช ํ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ธฐ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ(Heap) ์์ญ์ ์ ํ๋ ์์์ ๋๋ค. ๋ฐ๋ผ์ ์ธ์ ๋ ์ต์ ํ๊ฐ ํ์ํ๊ณ , ๊ฐ๋ณ๊ฒ ์ ์งํ ํ์๊ฐ ์์ฃ !
Swift๊ฐ ๊ณต๊ฐ๋๊ธฐ ์ด์ Obj-C ์ธ์ด๋ก iOS ์ฑ์ ๊ฐ๋ฐํ๋ ์์ ์๋ ์ด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ์๋์ผ๋ก ํด์ฃผ์ด์ผ ํ๋ค๊ณ ํฉ๋๋ค. ์ด๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ MRC(Manual Reference Counting)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
retain
: reference count๋ฅผ ์ฆ๊ฐ์์ผ ๊ฐ์ฒด๊ฐ ์ ์ง๋๋๋ก ๋ณด์ฅrelease
: reference count๋ฅผ ๊ฐ์์์ผ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ ๊ฒ์ ๋ฐฉ์ง
์ด ๋ ๊ธฐ๋ฅ์ ๊ณ์ํด์ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์ฃ . ์ ๋ง์ด์ง ๋๋ฌด ๋ฒ๊ฑฐ๋กญ์ง ์๋์..? ๊ทธ๋์ ์ ํ์ ๊ฐ๋ฐ์๋ค์ ํธ์์ฑ์ ์ํด ARC๋ฅผ ๋ฑ์ฅ์ํค๊ฒ ๋ ๊ฒ ์ ๋๋ค.
ARC๋ ์ปดํ์ผ ํ์์ ์ํ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ํ๋๋ ๋ฐฉ์์ด ๊ฐ๊ฐ์ ์ฝ๋ ์ค๊ฐ์ค๊ฐ์ ์๋์ผ๋ก retain
์ฝ๋์ release
์ฝ๋๋ฅผ ์ฝ์
์ํค๋ ๋ฐฉ์์
๋๋ค.
์ปดํ์ผ ํ์์๋ ๋จ์ํ ์ฝ๋๋ฅผ ์ฝ์
๋ง ํด์ฃผ๊ณ , ๋ฐํ์๋์ ์ฝ๋๊ฐ ์คํ๋๋ฉฐ reference count๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ count ๊ฐ์ด 0์ด ๋๋ฉด deinit
์ ํตํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํค๋ ๊ฒ์ด์ฃ !
์ ๊ทธ๋ฐ๋ฐ, ์๋์ผ๋ก ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์๋ฌด๋ฆฌ ํธํ๋๋ผ๋ ๊ฐ๋ฐ์๊ฐ ์ด๋์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ด์ฌ๋ฅผ ํ๊ณ ์ถ์ ๋๊ฐ ์๊ฒ ์ฃ ? ๊ทธ๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ํด์ strong
, weak
, unowned
๊ฐ ์กด์ฌํ๋ ๊ฒ ์
๋๋ค.
strong (๊ฐํ ์ฐธ์กฐ)
- ์ ์ธํ ๋ ์๋ฌด ํค์๋๋ ์ ์ด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ(default)์ผ๋ก ์ค์
- ํด๋น ์ธ์คํด์ค์ ์์ ๊ถ์ ๊ฐ์ง
- ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ reference count ์ฆ๊ฐ
- strong reference count๊ฐ 0์ด ๋๋ฉด ๊ฐ์ฒด๋
deinit
- ๊ฐ ์ง์ ์์ ์
retain
, ์ฐธ์กฐ ์ข ๋ฃ ์์ ์release
var david: Person? = Person(name: "David")
// reference count ++
david = nil // reference count --
๊ฐํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ๋๋ ์ฃผ์ํ ์ ์ด ํ๋ ์์ต๋๋ค. ๋ฐ๋ก ๊ฐํ ์ฐธ์กฐ ์ํ(Strong Reference Cycle) ์ ๋๋ค.
class Strong {
var strong: Strong? = nil
}
var strong1: Strong? = Strong()
var strong2: Strong? = Strong()
strong1?.strong = strong2
strong2?.strong = strong1
strong1 = nil
strong2 = nil
์ ์์๋ฅผ ๋ณด๋ฉด strong1
๊ณผ strong2
๋ ์๋ก์ strong์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค. ์ด ๋, strong์ ๊ฐํ ์ฐธ์กฐ ๊ฐ์ฒด๋ผ์ nil
์ ์ฃผ๊ธฐ ์ ๊น์ง ํด์ ๋์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ง๋ง strong1
๊ณผ strong2
์ nil
๊ฐ์ ์ฃผ๋ ค ํ ๋, ์๋ก๊ฐ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์์ด ๊ฐ๊ฐ์ ๊ฐ์ฒด ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ๋์์ง๋ง, ๊ฐ์ฒด ์์ฒด๋ ์ฌ์ ํ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ๋์ง ๋ชปํฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๊ฐ์ฒด ๋ณ์๋ ์ด๋ฏธ ํด์ ๊ฐ ๋์ด ๊ฐ์ฒด์ ์ ๊ทผํ ๋ฐฉ๋ฒ๋ ์๊ณ , ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ ๋ฐฉ๋ฒ๋ ์์ด์ง๊ฒ ๋ฉ๋๋ค. ์์ํ ๋ฉ๋ชจ๋ฆฌ์ ๋จธ๋ฌผ๋ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด์ฃ .
์ด๋ฐ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด weak
(์ฝํ ์ฐธ์กฐ)๊ฐ ํ์ํฉ๋๋ค.
weak (์ฝํ ์ฐธ์กฐ)
- ํด๋น ์ธ์คํด์ค์ ์์ ๊ถ์ ๊ฐ์ง์ง ์์
- ์ฃผ์๊ฐ๋ง ๊ฐ์ง์ผ๋ก์ ํฌ์ธํฐ์ฒ๋ผ ์ฌ์ฉ
- reference count๋ฅผ ์ฆ๊ฐ์ํค์ง ์์
- weak reference count๊ฐ 0์ด ๋๋ฉด
dead
- ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ ๋ ์๋์ผ๋ก
nil
๋ก ์ด๊ธฐํ - ํด๋น ์ธ์คํด์ค๊ฐ
nil
์ผ ์ ์๊ธฐ ๋๋ฌธ์ ํญ์optional
์ด์ด์ผ ํจ
weak var david: Person? = Person(named: "David")
// ๋ฐ๋ก ๊ฐ์ฒด ํด์ , nil
๊ทธ๋ ๋ค๋ฉด weak
๋ ์ด๋ป๊ฒ ์ฐธ์กฐ ์ํ์ ํด๊ฒฐํ ๊น์?
class Strong {
weak var strong: Strong? = nil
}
var strong1: Strong? = Strong()
var strong2: Strong? = Strong()
strong1?.strong = strong2
strong2?.strong = strong1
strong1 = nil
strong2 = nil
์์ ๊ฐ์ ์์์ด์ง๋ง ๊ฐ๊ฐ์ ๊ฐ์ฒด ๋ณ์๊ฐ weak
(์ฝํ ์ฐธ์กฐ)์ด๊ธฐ ๋๋ฌธ์ ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ์๋์ผ๋ก ๊ฐ์ฒด๊น์ง ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์์ผ ์ค๋๋ค.
์ฐธ์กฐ ์ํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋ค์!
unowned (๋ฏธ์์ ์ฐธ์กฐ)
- ํด๋น ์ธ์คํด์ค์ ์์ ๊ถ์ ๊ฐ์ง์ง ์์
- unowned reference count๊ฐ 0์ด ๋๋ฉด
free
- ํด๋น ์ธ์คํด์ค๋ฅผ
nil
๋ก ์ด๊ธฐํํ์ง ์์
๊ทธ๋์ ์ ์ ์ฐจ์ด๋?
strong
- ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉ
- Reference Count 1 ์ฆ๊ฐ
weak
- ์ํ ์ฐธ์กฐ์ ๊ฐ๋ฅ์ฑ์ด ์์ ๊ฒฝ์ฐ ์ฌ์ฉ
- ํญ์
var
- Reference Count ๋ณ๋ X
unowned
์ฌ์ด๋ ํ ์ด๋ธ (Side Table Entry)
์ค๋ช
์ ์์๋ ๊ฐํ ์ฐธ์กฐ ์ํ ๋๋ฌธ์ strong
โก๏ธ weak
โก๏ธ unowned
์ ์์๋ก ํ์ง๋ง ๊ฐ๋
์ ์์ธํ ์ดํด๋ณด๋ฉด strong
โก๏ธ unowned
โก๏ธ weak
์ ์์๋ก ๋ณด๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๊ฐํ ์ฐธ์กฐ ๋ณ์์ ๋ฏธ์์ ์ฐธ์กฐ ๋ณ์๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์ฐธ์กฐํ์ง๋ง, ์ฝํ ์ฐธ์กฐ ๋ณ์๋ ๊ฐ์ฒด์ ์ฌ์ด๋ ํ ์ด๋ธ์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด๋ถ์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด weak
, unowned
, strong
์ ์ข
๋ฅ์ ๋ฐ๋ผ ๋ฐ๋ก reference count๋ฅผ ์ธ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ์ข
๋ฅ์ reference count๋ฅผ ์ ๋ถ ์
๋๋ค.
์์ฐจ์ ์ผ๋ก ์ดํด๋ณด๋ฉด, strong reference count๊ฐ 0์ด ๋๋ฉด ๊ฐ์ฒด๋ deinit
๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ์๋ ๋จ์ ์์ต๋๋ค.
์ดํ unowned reference count๋ฅผ ์ฒดํฌํ์ฌ 0์ด ์๋๋ผ๋ฉด DEINITED
์ํ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ญ์ฑ ๋จ์์๊ณ , 0์ด๋ผ๋ฉด free
๋ฉ๋๋ค.
๊ทธ ์ดํ์๋ weak reference count๋ฅผ ์ฒดํฌํ์ฌ 0์ด ์๋๋ผ๋ฉด FREED
์ํ๊ฐ ๋์ด ์ฌ์ด๋ ํ
์ด๋ธ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๊ณ , 0์ด ๋์์๋์ผ ๋ชจ๋ reference count๊ฐ 0์ด ๋์ด ์ฌ์ด๋ ํ
์ด๋ธ์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉฐ ๊ฐ์ฒด๊ฐ DEAD
์ํ๊ฐ ๋ฉ๋๋ค.
์ State Machine ๊ทธ๋ํ๋ก ํ๋์ ์์๋ณด๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌํด๋ณผ ์ ์์ต๋๋ค.