๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Swift ์ •๋ฆฌ

[Swift] ARC (1); ARC์˜ ๊ฐœ๋…, Retain Count

by seolhee2750 2021. 9. 23.

์˜ค๋Š˜์€ ARC์— ๋Œ€ํ•ด ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๋ คํ•œ๋‹ค.

iOS ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๋“ค์–ด๋ณด๊ธฐ๋Š” ๋งŽ์ด ๋“ค์–ด๋ดค๋Š”๋ฐ,, ์ด์ œ์„œ์•ผ ๊ณต๋ถ€๋ฅผ ํ•˜๋Š”๊ทœ๋‚˜

๐Ÿ“Ž ARC (Auto Reference Counting)

์ด๋Ÿฐ ๊ฐœ๋… ์šฉ์–ด๋“ค์€ ์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ ์ด๋ฆ„์— ๋ชจ๋“  ๊ฒƒ์ด,,!

๋ง ๊ทธ๋Œ€๋กœ '์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ…'์ด๋‹ค.

ํ•œ ๋‹จ์–ด์”ฉ ๋ณด๋ฉด, ์šฐ์„  ์ฐธ์กฐ๋ฅผ ์นด์šดํŒ…ํ•˜๋Š” ์ด์œ ๋Š” ๋ญ˜๊นŒ? ๐Ÿ‘‰ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•จ์ผ๋“ฏ

๊ทธ๋Ÿผ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•œ๋‹ค? ๐Ÿ‘‰ ํŽธ๋ฆฌํ•˜๊ฒŒ, ์˜ค๋ฅ˜๋ฅผ ์ ๊ฒŒ! ํ•˜๊ธฐ ์œ„ํ•จ์ผ๋“ฏ

 

์ด๋ ‡๊ฒŒ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ

ARC๋Š” ํšจ๊ณผ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

 

+ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?
์•ฑ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ธ๋ฐ,
๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ  ํ•˜๋ฉด ํฌ๊ฒŒ ์Šคํƒ ์˜์—ญ,  ํž™ ์˜์—ญ ๋“ฑ์ด ์žˆ๋‹ค.
์ด ์ค‘ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” value ํƒ€์ž…์œผ๋กœ, ํŠน๋ณ„ํ•œ ๊ด€๋ฆฌ๊ฐ€ ์—†์–ด๋„ ๊ดœ์ฐฎ๋‹ค. (์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋จ)

๊ทธ๋Ÿฌ๋‚˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” reference ํƒ€์ž…์ด๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
(์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผํ•˜๋ฏ€๋กœ ์–ธ์ œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜๋Š”์ง€ ๋งค์šฐ ์ค‘์š”!
์ ์ ˆํ•œ ์‹œ์ ์— ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ํ•œ์ •์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

๐Ÿ‘‰ ๋”ฐ๋ผ์„œ ํž™์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ , 
ํšจ๊ณผ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ARC๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ ARC์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!


๐Ÿ“Œ MRC -> ARC

ARC๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด ๋ฌด์กฐ๊ฑด MRC๋ผ๋Š” ๊ฒƒ๋„ ์ ‘ํ•˜๊ฒŒ ๋์„ํ…๋ฐ,,

๋‘˜์€ ์•„์ฃผ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€์ด ์žˆ๊ธฐ์—.! ๊ฐ™์ด ํ•œ ๋ฒˆ ์•Œ์•„๋ณด์ž.
MRC๋Š” ์˜ˆ์ „์— Objective-C์—์„œ ์‚ฌ์šฉํ•˜๋˜ ์ˆ˜๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋„๊ตฌ์ด๋‹ค.

 

1) MRC๋Š” Manual Reference Counting์˜ ์•ฝ์ž๋กœ,

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ retain๊ณผ release๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์–‘์ด ๋งŽ์•„์ง€๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ฒŒ ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ ์•ˆ์ •์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.

 

2) ARC์— ์˜ํ•ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ARC๋Š” Xcode4์™€ ํ•จ๊ป˜ ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ,

Auto Reference Counting์ด๋ผ๋Š” ์ด๋ฆ„์— ๊ฑธ๋งž๊ฒŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋„ ํ›จ์”ฌ ์งง์•„์ง€๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ž ๊น,,

๋Œ€์ถฉ ์ˆ˜๋™์œผ๋กœ ์–ด๋ ต๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ํ•˜๋˜ MRC์—์„œ

์ž๋™์œผ๋กœ ์‰ฝ๊ณ  ํ€„๋ฆฌํ‹ฐ ๋†’๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ํ•ด์ฃผ๋Š” ARC๋กœ ๋„˜์–ด์™”๋‹ค๋Š”๊ฑด ์•Œ๊ฒ ๋‹ค.

 

๊ทผ๋ฐ retain, release๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค,,? ๐Ÿ˜ฐ

์ด๊ฑธ ๋จผ์ € ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ๊ฒ ๋‹ค.


๐Ÿ“Œ retain, release

๊ฐ ๋‹จ์–ด์˜ ์˜๋ฏธ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

๐Ÿ‘‰ retain

๊ฐ์ฒด์˜ reference count(retain count)๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋„๋ก ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š”๊ฒƒ.!

 

๐Ÿ‘‰ release

๊ฐ์ฒด์˜ reference count(retain count)๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

๊ฐ์ฒด๋ฅผ ๋”์ด์ƒ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์„ ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์นด์šดํŠธ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๊ฒƒ.!

 

์ด๋ ‡๊ฒŒ ARC๋Š” retain, release์˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ณ ,

์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ Reference Counting(Retain Counting)์ด๋ผ๊ณ  ํ•œ๋‹ค.๐Ÿ’ฅ


๐Ÿ“Ž ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ… (Reference Counting)

์œ„์—์„œ ๋งํ–ˆ๋“ฏ ๋‹จ์ˆœํžˆ ์ƒ๊ฐํ•˜๋ฉด ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ์‹œํ‚ค๋Š” ์ผ์ด์ง€๋งŒ

์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ..! ๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

'compile time์— ์ž๋™์œผ๋กœ retain, release๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹'

 

์œ„์˜ ์ •์˜๋ฅผ ๋’ท๋ฐ›์นจํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ๊ทธ๋ฆผ์„ ๊ทธ๋ ธ๋‹ค.

compile time๊ณผ run time์œผ๋กœ ๋‚˜๋ˆ ์„œ ํ‘œํ˜„ํ–ˆ๋Š”๋ฐ

1) compile time์—๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์˜ˆ์ธกํ•˜์—ฌ ์ ์ ˆํ•œ ์œ„์น˜์— retain, release๋ฅผ ์‚ฝ์ž…ํ•ด์ค€๋‹ค.

2) run time์— ์‚ฝ์ž…๋œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ retain, release์— ์˜ํ•ด reference count๋ฅผ ์ฆ๊ฐํ•˜๊ณ 

count๊ฐ€ 0์ด ๋˜์—ˆ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ!

 

+ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š”
' ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์˜ˆ์ธกํ•˜๋Š”๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ •ํ™•ํ•œ ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•œ์ง€? '
์ด๋Ÿฐ ๊ถ๊ธˆ์ฆ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด ์ฝ”๋“œ ์˜ˆ์ธก์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€
์ž๋ฐ” ๋“ฑ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์ธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ์˜ ์ฐจ์ด์ ์ด๊ธฐ๋„ ํ•˜๋‹ค.

1) ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜
์€ ๋ช…ํ™•ํ•œ ๊ทœ์น™์ด ์—†๊ธฐ์— ์˜ˆ์ธก์ด ์–ด๋ ต๊ณ , ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘ ์ค‘์— ํ•ด์ œ ์‹œ์ ์„ ๊ฒฐ์ •ํ•œ๋‹ค.

: ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์‹œ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž์›์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ณ ,
์ธ์Šคํ„ด์Šค๊ฐ€ ์–ธ์ œ ์ •ํ™•ํžˆ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

2) ARC๋Š” ๋ช…ํ™•ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์ปดํŒŒ์ผ ์‹œ ์ธ์Šคํ„ด์Šค ํ•ด์ œ ์‹œ์ ์„ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜์—ฌ ๊ฒฐ์ •ํ•œ๋‹ค.
: ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์‹œ์Šคํ…œ ์ž์›์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด๋‹ค.
ํ•˜์ง€๋งŒ ARC์˜ ์ž‘๋™ ๊ทœ์น™์„ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค์˜ ํ•ด์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ARC๋Š” ์ปดํŒŒ์ผ๊ณผ ๋™์‹œ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๋Š” ์‹œ์ ์„ ๊ฒฐ์ •ํ•˜๋ฏ€๋กœ,
์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ฒŒ ํ•˜๋ ค๋ฉด ๋ช…ํ™•ํ•œ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค.

์ œ๋Œ€๋กœ ํžŒํŠธ๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์•„์ง ๋” ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œ์ผœ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ๋œ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ณ ,
์ธ์Šคํ„ด์Šค์— ๊ฐ•์ œ๋กœ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋‹ค๊ฐ€ ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ์ธํ•ด ํ”„๋กœํ”„๊ทธ๋žจ์˜ ๊ฐ•์ œ์ข…๋ฃŒ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๐Ÿ‘‰ ์ ์ ˆํ•˜์ง€ ์•Š๊ฒŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š”
๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ๋“ฑ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.
๊ทธ๋Ÿฐ ์ƒํ™ฉ์€ ARC๊ฐ€ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๊ณ  ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋ช…๋ถ„์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€์‹œํ‚ค๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ๋ช…๋ถ„์„ ARC์— ์ œ๊ณตํ•ด์•ผํ•˜๋ฉฐ, ์ด๊ฒŒ ๋ฐ”๋กœ ์œ„์—์„œ ๋งํ•œ ํžŒํŠธ๋ฅผ ๋œปํ•œ๋‹ค.

/* ์ธ์Šคํ„ด์Šค๊ฐ€ ์–ธ์ œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์–ด์•ผ ํ•  ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋„๋ก ARC์— ์ ์šฉ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์ด ์žˆ๋‹ค.
ํฌ๊ฒŒ ๊ฐ•ํ•œ ์ฐธ์กฐ, ์•ฝํ•œ ์ฐธ์กฐ, ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ,
์ด ๊ทœ์น™๋“ค, ๊ทธ๋ฆฌ๊ณ  ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์•Œ์ง€ ๋ชปํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ! ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค. */

 

์ด๋ก ์„ ๊ณต๋ถ€ํ–ˆ์œผ๋‹ˆ ์œ„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ,,

์กฐ๊ธˆ ๋” ์™„๋ฒฝํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณด์ž!


๐Ÿ“Œ ARC ๋™์ž‘ ๊ตฌํ˜„

์œ„์—์„œ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์„ ๋ฐ”ํƒ•์œผ๋กœ, ARC์˜ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์ž‘์„ฑํ•ด๋ดค๋‹ค.

(์Šค์œ„ํ”„ํŠธ ๊ณต์‹ ๋ฌธ์„œ ๊ธฐ๋ฐ˜)

import Foundation

class ARC_Example {
    let message: String
    init(message: String) {
        self.message = message
        print("\(message) is being initialized")
    }
    deinit {
        print("\(message) is being deinitialized")
    }
}

// ARC_Example ํด๋ž˜์Šค ํƒ€์ž…์„ ๊ฐ–๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜ 2๊ฐœ A, B
var A: ARC_Example?
var B: ARC_Example?

A = ARC_Example(message: "ARC ๋™์ž‘ ์ฝ”๋“œ")
// Prints "ARC ๋™์ž‘ ์ฝ”๋“œ is being initialized"
B = A

A = nil
B = nil
// Prints "ARC ๋™์ž‘ ์ฝ”๋“œ is being initialized"

ARC_Example ์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ–ˆ๊ณ ,

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์™€ ํ•ด์ œ๋  ๋•Œ print๋กœ ๋กœ๊ทธ๋ฅผ ์ฐ๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

ARC_Example ํด๋ž˜์Šค ํƒ€์ž…์„ ๊ฐ–๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๋กœ ๊ฐ๊ฐ A, B๋ฅผ ์„ ์–ธํ–ˆ๊ณ , 

A์— ARC_Example ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•œ ํ›„ B๊ฐ€ A๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ–ˆ๋‹ค.

=> A, B ๋ชจ๋‘ ARC_Example ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๊ณ ,

ARC_Example ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋Š” 2๊ฐ€ ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ฐจ๋ก€๋Œ€๋กœ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋Š”๋ฐ,

๋จผ์ € A์— nil์„ ํ• ๋‹นํ•˜์—ฌ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ–ˆ๋‹ค. ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋Š” 2์—์„œ 1์„ ๊ฐ์†Œ์‹œ์ผœ์„œ 1์ด ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ์œผ๋กœ B์˜ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ–ˆ๋Š”๋ฐ ์ด ๋•Œ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋Š” 0์ด ๋˜์–ด

ARC๋Š” ARC_Example ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋Š” deinit ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ, ์†Œ๋ฉธ๋œ๋‹ค.

(ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”์ด์ƒ ์ฐธ์กฐํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š” ๊ณผ์ •์„ ์†Œ๋ฉธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํด๋ž˜์Šค ๋‚ด๋ถ€์— deinit ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „ deinit ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

๋””์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜๋งŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.)

 

์œ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋กœ๊ทธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


๐ŸŒŸ ์ •๋ฆฌ

ARC๋Š” retain, release๋ฅผ ํ†ตํ•ด ์ ์ ˆํ•œ ๋•Œ์— retain count์˜ ์ฆ๊ฐ์„

์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์คŒ์œผ๋กœ์จ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

 

+ ์ถ”๊ฐ€!

Retain Cycle, ๊ฐ•ํ•œ์ฐธ์กฐ, ์•ฝํ•œ์ฐธ์กฐ, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ์†Œ์œ ์ฐธ์กฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์šฉ

2021.10.04 - [๐Ÿ“ Swift Note/๐Ÿ“‹ ๊ฐœ๋… ์ •๋ฆฌ] - [Swift] ARC (2); ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, Retain Cycle

 

[Swift] ARC (2); ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, Retain Cycle

์ €๋ฒˆ ๊ธ€์—์„œ๋Š” ARC์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋Š”๋ฐ, ์˜ค๋Š˜์€ ARC๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๊ทธ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ ํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

seolhee2750.tistory.com

 


์ฐธ๊ณ 

๋Œ“๊ธ€