๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Dev Blog
iOS/Swift

[Swift] ARC

by ์œ ์ง„์˜ 2024. 5. 24.

๊ฐ•ํ•œ ์ฐธ์กฐ๋Š” ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

๊ฐ•ํ•œ ์ฐธ์กฐ๋Š” ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ ๊ณ„์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 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 ๊ฐ’์€ ์ธ์Šคํ„ด์Šค ์ž์ฒด์— ์ €์žฅ๋˜์–ด ๊ด€๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

https://maximeremenko.com/swift-arc-weak-references

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ strong RC ๊ฐ’์ด 0์ด ๋˜์–ด๋„ weak RC ๊ฐ’์ด 0 ์ด์ƒ์ด๋ผ๋ฉด deinitialized๋Š” ๋˜์ง€๋งŒ deallocated๋Š” ๋˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ข€๋น„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

(weak RC ๊ฐ’์ด 0 ์ด์ƒ์ผ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€๋Š” ์•Š๋Š” ์ด์œ ๋Š” ๊ณต์‹์ ์ด๊ฑฐ๋‚˜ ์ •ํ™•ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ๊ธ€์„ ์•„์ง ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ, weak ์ฐธ์กฐ ์ธ์Šคํ„ด์Šค๋ฅผ nil๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์ฃผ๋Š” ์ž‘์—…๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์œ ์ถ”ํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค..!)

 

Swift 4 ์ดํ›„์—๋Š” ์ด์ „์˜ ์ข€๋น„ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ จ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž Side Table์ด๋ผ๋Š” ๋ณ„๋„์˜ ๊ด€๋ฆฌ ๊ฐœ์ฒด๊ฐ€ ๋“ฑ์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://maximeremenko.com/swift-arc-weak-references

 

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 ์ฐธ์กฐ ์นด์šดํŠธ๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

https://medium.com/@gauravkeshre/swift-object-lifecycle-b39d232cb99b

 

  • unowned ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

https://medium.com/@gauravkeshre/swift-object-lifecycle-b39d232cb99b

 

  • ๋ชจ๋“  ์ฐธ์กฐ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ

https://medium.com/@gauravkeshre/swift-object-lifecycle-b39d232cb99b

 

 

๊ฐ๊ฐ์˜ ์ฐธ์กฐ ์นด์šดํŠธ ์œ ๋ฌด์— ๋”ฐ๋ฅธ ์ƒ๋ช… ์ฃผ๊ธฐ์˜ ์ƒํƒœ ์ „์ด๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://shubhamchawla00.medium.com/memory-management-on-ios-ad2244b49b20

 

 

 

ARC์™€ GC๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋‚˜์š”?

 

ARC๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฐธ์กฐ ๊ณ„์ˆ˜๋ฅผ ์ฆ๊ฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฐธ์กฐ ๊ณ„์ˆ˜๊ฐ€ 0์ด ๋œ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œํ‚ต๋‹ˆ๋‹ค.

 

GC๋Š” ๋Ÿฐํƒ€์ž„์— ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œํ‚ต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ๋งํ•˜๋ฉด, GC๋Š” ํž™ ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋“ค์„ ๊ทธ๋ž˜ํ”„๋กœ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๊ทธ๋ž˜ํ”„์˜ ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์€ Mark ํ•˜๊ณ  Mark ๋˜์ง€ ์•Š๋Š” ์ธ์Šคํ„ด์Šค๋“ค์€ Garbage๋กœ ํŒ๋‹จํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œํ‚ต๋‹ˆ๋‹ค.

 

https://inpa.tistory.com/entry/JAVA- โ˜•-๊ฐ€๋น„์ง€-์ปฌ๋ ‰์…˜GC-๋™์ž‘-์›๋ฆฌ-์•Œ๊ณ ๋ฆฌ์ฆ˜-๐Ÿ’ฏ-์ด์ •๋ฆฌ

 

 

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๋กœ๋ถ€ํ„ฐ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋˜์–ด๋ฒ„๋ ค ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€