๊ฐํ ์ฐธ์กฐ๋ ๋ฌด์์ด๊ณ ์ ํ์ํ๊ฐ์?
๊ฐํ ์ฐธ์กฐ๋ ์ฐธ์กฐ ํ์ ์ธ์คํด์ค์ ์ฐธ์กฐ ๊ณ์๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ ๋๋ค. Swift๋ ARC๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ์ฐธ์กฐ ๊ณ์๊ฐ 0์ด ๋๋ ์ธ์คํด์ค๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๊ฒ ๋ฉ๋๋ค. ๊ฐํ ์ฐธ์กฐ๊ฐ ์กด์ฌํด์ผ ์ฐธ์กฐ ๊ณ์๊ฐ 0์ด ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๊ณ ์ ์ง์ํฌ ์ ์์ต๋๋ค.
strong, weak, unowned reference๋ ๊ฐ๊ฐ ์ธ์ ์ฌ์ฉํ ๊น์?
๊ฐํ ์ฐธ์กฐ๋ ์ฐธ์กฐ ๊ณ์๋ฅผ 1 ์ฆ๊ฐ์์ผ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ์ง์ํฌ ํ์๊ฐ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํฉ๋๋ค.
์ฝํ ์ฐธ์กฐ๋ ๊ฐํ ์ฐธ์กฐ๋ฅผ ํ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋ ๊ฐํ ์ํ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐํ ์ฐธ์กฐ์ ๋ฌ๋ฆฌ ์ฐธ์กฐ ๊ณ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๊ณ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด nil๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์๋ฌ ์์ด ์์ ํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ฏธ์์ ์ฐธ์กฐ๋ ์ฝํ ์ฐธ์กฐ์ ๊ฐ์ด ๊ฐํ ์ํ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋๋ฐ, ์ฝํ ์ฐธ์กฐ์ ๋ฌ๋ฆฌ ์ฐธ์กฐ๋นํ๋ ๊ฐ์ฒด๊ฐ ํด์ ๋์ด๋ nil๋ก ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๋นํ๋ ๊ฐ์ฒด๊ฐ ํญ์ ์ฐธ์กฐ ์ฃผ๊ธฐ ๋์ ์กด์ฌํ ๊ฒ์ด๋ผ๋ ๋ช ์์ ์ผ๋ก ๋ํ๋ด๊ณ ์ถ์ ๋ ํน์ ์ต์ ๋ ๊ด๋ จ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ, ์ฝํ ์ฐธ์กฐ์ ๊ฒฝ์ฐ ์ฐธ์กฐ๋นํ๋ ๊ฐ์ฒด๊ฐ ํด์ ๋ ๋ nil๋ก ๋ฐ๊พธ๋ ๋์์ ๋ํ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํค๊ณ ์ถ์ง ์์ ๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
๐ weak๊ณผ unowned ์ฐธ์กฐ์ ์คํด
ํํ weak๊ณผ unowned ์ฐธ์กฐ๋ ์ฐธ์กฐ ๊ณ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋ ์ฐธ์กฐ ๋ฐฉ์์ด๋ผ๊ณ ์ค๋ช ๋ฉ๋๋ค. ์ ํํ๊ฒ ๋งํ์๋ฉด, ๊ฐํ ์ฐธ์กฐ ๊ณ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋ ์ฐธ์กฐ ๋ฐฉ์์ ๋๋ค. ์๋ํ๋ฉด weak๊ณผ unowned์ ๋ํ ์ฐธ์กฐ ๊ณ์๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Strong RC
์ด ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ์ธ์คํด์ค๊ฐ Deinitialized ๋ฉ๋๋ค. ์ด ์นด์ดํธ๊ฐ 0์ด ๋ ๋, unowned ์ฐธ์กฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ์ ์๋ฌ, weak ์ฐธ์กฐ๋ nil๋ก ๋ฐ๋๋๋ค.
Unowned RC
์ธ์คํด์ค๊ฐ Deinitialized ๋๋ฉด ํด๋น ์นด์ดํธ๋ ๊ฐ์ํฉ๋๋ค. ํด๋น ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ๊ทธ์ ์ผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ (Deallocated)๋ฉ๋๋ค. ์ด๋, weak RC๊ฐ 0์ด ์๋๋ฉด Side Table์ ๋จ์์์ต๋๋ค.
Weak RC
์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด ์นด์ดํธ๊ฐ ๊ฐ์ํฉ๋๋ค. ํด๋น ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ์ธ์คํด์ค์ Side Table ๋ํ ํด์ ๋ฉ๋๋ค.
๐ Side Table
Swift 4 ์ด์ ์๋ strong, unowned, weak RC ๊ฐ์ ์ธ์คํด์ค ์์ฒด์ ์ ์ฅ๋์ด ๊ด๋ฆฌ๋์์ต๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ strong RC ๊ฐ์ด 0์ด ๋์ด๋ weak RC ๊ฐ์ด 0 ์ด์์ด๋ผ๋ฉด deinitialized๋ ๋์ง๋ง deallocated๋ ๋์ง ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์, ์ข๋น ์ค๋ธ์ ํธ๋ฅผ ๋ฐ์์ํค๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ์์ต๋๋ค.
(weak RC ๊ฐ์ด 0 ์ด์์ผ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง๋ ์๋ ์ด์ ๋ ๊ณต์์ ์ด๊ฑฐ๋ ์ ํํ ์ด์ ์ ๋ํ ๊ธ์ ์์ง ์ฐพ์ง ๋ชปํ์ง๋ง, weak ์ฐธ์กฐ ์ธ์คํด์ค๋ฅผ nil๋ก ๋ณํ์์ผ ์ฃผ๋ ์์ ๊ณผ ๊ด๋ จ์ด ์๋ ๊ฒ์ผ๋ก ์ ์ถํด ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค..!)
Swift 4 ์ดํ์๋ ์ด์ ์ ์ข๋น ์ค๋ธ์ ํธ ๊ด๋ จ ์ด์๋ฅผ ํด๊ฒฐํ๊ณ ์ Side Table์ด๋ผ๋ ๋ณ๋์ ๊ด๋ฆฌ ๊ฐ์ฒด๊ฐ ๋ฑ์ฅํ์์ต๋๋ค.
Side Table์ด ์์ฑ๋๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- weak ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ๋
- strong, unowned ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๋๋ฌด ์ปค ์ค๋ฒํ๋ก์ฐ ๋๋ ๊ฒฝ์ฐ
์ ๊ทธ๋ฆผ์์ Side Table์ ๋ํด ์ด 2๊ฐ์ง๋ฅผ ํ์ธํด๋ณผ ์ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ก, Side Table์ weak RC ๊ฐ๊ณผ ๋๋ถ์ด ๋ค๋ฅธ ์ฐธ์กฐ ์นด์ดํธ๋ค๋ ์ ์ฅ๋์ด์์ต๋๋ค. Side Table์ด ์ ์ฅ๋๊ธฐ ์ , ์ฆ weak ์ฐธ์กฐ๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์๋ Side Table์ด ์์ฑ๋๊ธฐ ์ ์ด๋ฏ๋ก ์ธ์คํด์ค ์์ฒด์๋ strong, unowned RC ๊ฐ์ ๋ํ ๊ณต๊ฐ์ด ์๋ ๊ฒ ๊ฐ์๋ฐ Side Table์๋ ์๋ ์ด์ ์ ๋ํด ์ ํํ ์ค๋ช ์ ์ฐพ์ ์ ์์์ง๋ง, ๋ ๋ฒ์งธ ์ด์ ์ ๊ด๋ จ์ด ์๋ ๊ฒ์ผ๋ก ํ๋จ๋ฉ๋๋ค.
์ฌ์ค์ ๋ ๋ฒ์งธ ์ด์ ๊ฐ ๊ฐ์ฅ ์ฃผ๋ชฉํด์ผ ํ๋ ๋ถ๋ถ์ผ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆผ์ ํ์ดํ๋ฅผ ์ ๋ณด๋ฉด strong๊ณผ unowned ์ฐธ์กฐ๋ ์ธ์คํด์ค ์์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง, weak ์ฐธ์กฐ๋ Side Table์ ๊ฐ๋ฆฌํค๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด, weak ์ฐธ์กฐ๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ์๋ ์ธ์คํด์ค์ ๋ํ ์ง์ ์ ์ธ ์ฐธ์กฐ๊ฐ ์๋ Side Table์ ํตํ ๊ฐ์ ์ ์ธ ์ฐธ์กฐ๊ฐ ์ด๋ค์ง๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด, Side Table์ weak RC ๊ฐ ์ธ์ ๋ค๋ฅธ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์กด์ฌํ๋ ์ด์ ๊ฐ weak ์ฐธ์กฐ ์ ์ธ์คํด์ค ์์ฒด๊ฐ ์๋ Side Table์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ RC ๊ฐ์ ์บ์ฑํด๋ ๊ฒ ์๋๊น๋ผ๊ณ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ ์ถํด๋ด ๋๋ค...!
์ด๋ ๊ฒ weak ์ฐธ์กฐ ๊ด๋ฆฌ๋ฅผ ์ธ์คํด์ค ์์ฒด๊ฐ ์๋ Side Table์์ ๊ด๋ฆฌํ๊ฒ ๋จ์ผ๋ก์จ weak RC ๊ฐ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ strong RC๊ฐ 0์ด ๋๋ฉด ์ธ์คํด์ค๋ฅผ ์ ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํฌ ์ ์๊ฒ ๋์์ต๋๋ค.
๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ weak ์ฐธ์กฐ์ unowned ์ฐธ์กฐ์ ์ฐจ์ด์ ์ ๋ํด '์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋์ nil ๋ณํ ์ ๋ฌด' ๋ฟ๋ง ์๋๋ผ 'Side Table์ ์์ฑ ์ฌ๋ถ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ ๋ฒจ์์์ ์ง/๊ฐ์ ์ฐธ์กฐ ๋ฐฉ์์ ์ฐจ์ด'๋ ์๊ธฐํด ๋ณผ ์ ์๊ฒ ๋ค์.
๐ Swift ์ฐธ์กฐ ํ์ ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ
Swift์ ์ฐธ์กฐ ํ์ ์ธ์คํด์ค๋ 3๊ฐ์ง ์ฐธ์กฐ ๋ฐฉ์์ ๋ํ ์ฐธ์กฐ ์นด์ดํธ์ ๋ฐ๋ผ ๊ฐ๊ฐ์ ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ค.
- strong ์ฐธ์กฐ ์นด์ดํธ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ
- unowned ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
- ๋ชจ๋ ์ฐธ์กฐ ๋ฐฉ์์ ๋ํ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ
๊ฐ๊ฐ์ ์ฐธ์กฐ ์นด์ดํธ ์ ๋ฌด์ ๋ฐ๋ฅธ ์๋ช ์ฃผ๊ธฐ์ ์ํ ์ ์ด๋๋ฅผ ๋ํ๋ด๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
ARC์ GC๋ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์?
ARC๋ ์ปดํ์ผ ํ์์ ์ฐธ์กฐ ๊ณ์๋ฅผ ์ฆ๊ฐํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฐธ์กฐ ๊ณ์๊ฐ 0์ด ๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํต๋๋ค.
GC๋ ๋ฐํ์์ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์งํ๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํต๋๋ค. ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๋งํ๋ฉด, GC๋ ํ ์์ญ์ ์กด์ฌํ๋ ์ธ์คํด์ค๋ค์ ๊ทธ๋ํ๋ก ๊ด๋ฆฌํ๋๋ฐ ๊ทธ๋ํ์ ๋ฃจํธ๋ก๋ถํฐ ๋๋ฌํ ์ ์๋ ์ธ์คํด์ค๋ค์ Mark ํ๊ณ Mark ๋์ง ์๋ ์ธ์คํด์ค๋ค์ Garbage๋ก ํ๋จํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํต๋๋ค.
ARC๋ ์ฐธ์กฐ ๊ณ์๊ฐ 0์ด ๋๋ ์ฆ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํจ๋ค๋ ์ฅ์ ์ด ์๊ณ , ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธด๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
GC๋ ๋์ํ๋ ๋์์๋ ๋ค๋ฅธ ๋์๋ค์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์(Stop-the-World) ์๋น์ค ์ด์ฉ์ด ์ฐจ์ง์ด ์๊ธธ ์ ์๊ณ , ์ด๋ฌํ ํด์ ๊ณผ์ ์ด ์ธ์ ๋์ํ๋์ง ์ ํํ๊ฒ ์ ์ ์์ด ์ ์ดํ๊ธฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์์ง๋ง, ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ์ฌ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธฐ์ง ์๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ ์ ์๋ ์ํฉ์ด ๋ฌด์์ด๊ณ GC๋ ํด๊ฒฐํ ์ ์์๊น์?
ARC์์๋ ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ํด๋์ค ์ธ์คํด์ค๋ผ๋ฆฌ ์๋ก๋ฅผ ํ๋กํผํฐ๋ก ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, ํด๋์ค์ ํ๋กํผํฐ๋ก ํด๋ก์ ๋ฅผ ์ฐธ์กฐํ๊ณ ํด๋ก์ ๋ด๋ถ์์ self ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐํ ์ํ ์ฐธ์กฐ์ ์๋ก ๋ค ์ ์์ต๋๋ค.
๐ ๊ฐํ ์ํ ์ฐธ์กฐ ์ฝ๋ ์์
class A {
var b: B?
}
class B {
var a: A?
}
var a: A? = A() // ์ธ๋ถ ์ฐธ์กฐ
var b: B? = B() // ์ธ๋ถ ์ฐธ์กฐ
a?.b = b // ๋ด๋ถ ์ฐธ์กฐ
b?.a = a // ๋ด๋ถ ์ฐธ์กฐ
a = nil // ์ธ๋ถ ์ฐธ์กฐ ์ฌ๋ผ์ง
b = nil // ์ธ๋ถ ์ฐธ์กฐ ์ฌ๋ผ์ง
// ----------------------------------
class C {
var something = 1
lazy var cls = {
print(self.something)
}
}
var c: C? = C()
c?.cls() // C์ ์ธ์คํด์ค๋ ํด๋ก์ ๋ฅผ ํด๋ก์ ๋ C์ ์ธ์คํด์ค๋ฅผ ์๋ก ์ฐธ์กฐ
c = nil
GC๋ ์์์ ์ค๋ช ํ์๋ฏ Mark and Sweep ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํฉ๋๋ค.
๊ฐํ ์ํ ์ฐธ์กฐ๋ ์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด ์ธ์คํด์ค๋ค๋ผ๋ฆฌ ์๋ก ๋ด๋ถ์ ์ผ๋ก ์ฐธ์กฐํ๊ณ ๊ฐ ์ธ์คํด์ค์ ์ธ๋ถ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ ธ ์๋ก์ ๋ํ ๋ด๋ถ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
์ธ๋ถ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ก๋ค๋ ์๋ฏธ๋ GC Root ์์ฒด๊ฐ ์ฌ๋ผ์ก๋ค๋ ๋ง๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๋ด๋ถ ์ฐธ์กฐ ์ธ์คํด์ค๋ค์ด GC Root๋ก๋ถํฐ ๋๋ฌํ ์ ์๋ ์ธ์คํด์ค๊ฐ ๋์ด๋ฒ๋ ค ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค.
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Extension (1) | 2024.10.29 |
---|---|
[Swift] Objective-C (1) | 2024.10.28 |
[Swift] - ์ฝ๋ ์ ํ์ (Collection Types) (0) | 2024.10.27 |
[Swift] - ๊ธฐ๋ณธ ์ฐ์ฐ์ (Basic Operators) (0) | 2024.10.26 |
[Swift] - ๋ฌธ์์ด๊ณผ ๋ฌธ์ (Strings and Characters) (0) | 2024.10.25 |
๋๊ธ