[WWDC 21] ARC in Swift: Basics and beyond

๋ฏผ๋‹ˆยท2022๋…„ 12์›” 23์ผ
0

WWDC

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

๐Ÿ’ก ์ด ๊ธ€์€ WWDC21์˜ ARC in Swift: Basics and beyond ์„ธ์…˜์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.


ARC

Swift๋Š” ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๊ฐ’ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค. ์˜๋„ํ•˜์ง€ ์•Š์€ ์‹ค์ˆ˜๋“ค์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด(์ฐธ์กฐ ํƒ€์ž…์˜ ํŠน์„ฑ ๐Ÿฅฒ) ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ํด๋ž˜์Šค๋Š” Swift์˜ ์ฐธ์กฐ ํƒ€์ž…์ด๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Swift๋Š” ARC๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.


Object lifetimes and ARC

๊ฐ์ฒด์˜ ์ˆ˜๋ช…์€ ์ดˆ๊ธฐํ™”์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด ๋๋‚œ๋‹ค. ARC๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์ด ๋‹คํ•˜๊ฒŒ ๋˜๋ฉด ํ• ๋‹น์„ ํ•ด์ œํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๋˜ํ•œ, ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ์ถ”์ ํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ๊ฒฐ์ •ํ•œ๋‹ค.

ARC๋Š” ์œ ์ง€(retain)ํ•˜๊ณ  ํ•ด์ œ(release) ์ž‘์—…์„ ํ•˜๋Š” Swift ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž‘๋™๋œ๋‹ค. ๋Ÿฐํƒ€์ž„ ์‹œ์— retain์€ ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€, release๋Š” ๊ฐ์†Œ์‹œํ‚จ๋‹ค. ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค.

โ“ย ARC๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๊ตฌ๋™๋œ๋‹ค๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ผ์–ด๋‚œ๋‹ค๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€? ์™œ ๋Ÿฐํƒ€์ž„์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฑธ๊นŒ?
โ†’ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ retain/release operation์„ ๋„ฃ๊ณ , ๋Ÿฐํƒ€์ž„์— retain๊ณผ release๊ฐ€ ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ


์—ฌํ–‰ ์•ฑ์„ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.

์„ธ์…˜์—์„œ ๋ณด์—ฌ์ค€ ์˜ˆ์‹œ์ธ๋ฐ, ์ฒ˜์Œ์—๋Š” name ์„ ์–ธ์ด ์ด์ƒํ•˜์ง€ ์•Š๋‚˜ ์‹ถ์—ˆ๋‹ค. ์•„๋งˆ ๋กœ์ง์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋„ˆ๋ฌด ๋””ํ…Œ์ผํ•˜๊ฒŒ ๋ณด์ง€๋Š” ๋ง๊ณ  ์˜๋ฏธ๋งŒ ์ž˜ ์ƒ๊ฐํ•ด ๋ณด์ž!

์—ฌํ–‰์ž name๊ณผ destination ์†์„ฑ์ด ์žˆ๋Š” ํด๋ž˜์Šค Traveler ์„ ๋งŒ๋“ค์—ˆ๋‹ค. test ํ•จ์ˆ˜์—์„œ๋Š” Traveler ์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , traveler2 ์— traveler1 ์„ ํ• ๋‹นํ•ด ์ฃผ์—ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฐธ์กฐ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ตฌ๊ฐ„์— retain ์„ ์‚ฝ์ž…ํ•˜๊ณ , ์ฐธ์กฐ๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๊ฐ„์— release ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

traveler1์˜ ์‹œ์ž‘๊ณผ ๋

์ปดํŒŒ์ผ๋Ÿฌ๋Š” traveler1 ์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์งํ›„์— release๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ์ดˆ๊ธฐํ™”๋ฅผ ํ•  ๋•Œ, ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1๋กœ ์„ค์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ retain์„ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๋Š”๋‹ค.

traveler2

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฐธ์กฐ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ retain์„ ์‚ฝ์ž…ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์งํ›„์— release๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„ ์‹œ์— ์ผ์–ด๋‚˜๋Š” ์ผ๋“ค์„ ์‚ดํŽด๋ณด์ž.

Traveler์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํž™์— ์ƒ์„ฑ๋˜๊ณ , ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

retain ์ด ์‹คํ–‰๋˜์–ด ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1 ์ฆ๊ฐ€ํ•˜์—ฌ ref_count๋Š” 2

traveler1์„ traveler2์— ํ• ๋‹น

traveler1์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ release๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1 ๊ฐ์†Œํ•˜์—ฌ ref_count๋Š” 1

destination์ด Bir Sur๋กœ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

traveler2 ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด release ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1 ๊ฐ์†Œํ•˜์—ฌ ref_count๋Š” 0. ๊ฐ์ฒด์˜ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค.


Object lifetimes

Swift ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์€ use-based์ด๋‹ค. ๊ฐ์ฒด์˜ ๋ณด์žฅ๋œ ์ตœ์†Œ ์ˆ˜๋ช…(guaranteed object lifetimes)์€ ์ดˆ๊ธฐํ™”๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ๊นŒ์ง€์ด๋‹ค.

์ด์ „ ์˜ˆ์ œ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ์งํ›„์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋‹ค.

๊ฐ์ฒด์˜ ์ˆ˜๋ช…์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฝ์ž…ํ•œ retain๊ณผ release์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

ํ•˜์ง€๋งŒ ARC ์ตœ์ ํ™”์™€ ๊ฐ™์€ ์ด์œ ๋กœ, ๊ฐ์ฒด์˜ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ์ด ์ง€๋‚œ ๋‹ค์Œ์— ํ•ด์ œ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์‚ฌ์‹ค, ๋Œ€๋ถ€๋ถ„ ๊ฐ์ฒด์˜ ์ •ํ™•ํ•œ ์ˆ˜๋ช…์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ weak , unowned ์ฐธ์กฐ๋‚˜ deinitializer ๋ฅผ ์“ธ ๋• ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๐Ÿšจ

์ด๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ observeํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, guaranteed object lifetimes๊ฐ€ ์•„๋‹Œ observed object lifetime์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ค๋Š˜๋‚ ์—๋Š” ํ†ตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์‹ค ๊ทธ๋ƒฅ ์šฐ์—ฐ์˜ ์ผ์น˜์ด๋‹ค. (โ€ฆ๋งต๋‹คโ€ฆ ๐Ÿฅฒ) Observed object lifetimes์˜ ๋ฒ„๊ทธ๋Š” ๊ฐœ๋ฐœ ์ค‘์— ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ณ  ์˜ค๋žซ๋™์•ˆ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ์†Œ์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฐ‘์ž๊ธฐ ๋ฐœ๊ฒฌ๋  ์ˆ˜๋„โ€ฆ

์ด์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.


weak & unowned

Swift ์ฐธ์กฐ์˜ ๋””ํดํŠธ๋Š” ๊ฐ•ํ•จ ์ฐธ์กฐ์ด๋‹ค. ๊ฐ•ํ•œ ์ฐธ์กฐ์™€ ๋‹ฌ๋ฆฌ weak์™€ unowned ์ฐธ์กฐ๋Š” ์ฐธ์กฐ ํšŸ์ˆ˜์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐธ์กฐ ์ˆœํ™˜์„ ๋Š๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์ฐธ์กฐ ์ˆœํ™˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ด์ „ ์˜ˆ์ œ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์—ฌํ–‰์ž๋Š” ๊ณ„์ •์„ ๊ฐ€์ง€๊ณ  ํฌ์ธํŠธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. test() ํ•จ์ˆ˜์—์„œ Traveler ํด๋ž˜์Šค์™€ Account ํด๋ž˜์Šค์˜ ๊ฐใ…Š๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, printSummary() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

Traveler ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ํž™์— ์ƒ์„ฑ๋˜๊ณ , ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1์ด ๋œ๋‹ค.

Account ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ํž™์— ์ƒ์„ฑ๋˜๊ณ , ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1์ด ๋œ๋‹ค. traveler์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 2๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.

traveler๊ฐ€ account๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ, Account ๊ฐ์ฒด์˜ ์ฐธ์กฐ ํšŸ์ˆ˜๋„ 2๊ฐ€ ๋œ๋‹ค.

account๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1 ๊ฐ์†Œํ•œ๋‹ค.

printSummary ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ traveler๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 1 ๊ฐ์†Œํ•œ๋‹ค.

๋ชจ๋“  ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ง„ ํ›„์—๋„ ref_count๋Š” ๋‚จ์•„์žˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์ฐธ์กฐ ์ˆœํ™˜์ด๋ผ ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์•„์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ weak๋‚˜ unowned๋Š” ์ฐธ์กฐ ํšŸ์ˆ˜์— ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋“ค์ด ์‚ฌ์šฉ๋˜๋Š” ๋™์•ˆ์— ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋  ์ˆ˜ ์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์‹œ์— weak๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋  ๋•Œ nil์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , unowned๋กœ ์ฐธ์กฐ๋  ๋•Œ๋Š” ํŠธ๋žฉ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค. ๋ชจ๋“  ์ฐธ์กฐ๋Š” ์ฐธ์กฐ ์ˆœํ™˜์„ ๊นจ๊ธฐ ์œ„ํ•ด weak๋‚˜ unowned๋กœ ์„ ์–ธ๋  ์ˆ˜ ์žˆ๋‹ค.

Account ํด๋ž˜์Šค์˜ traveler์„ weak๋กœ ์„ ์–ธํ–ˆ๋‹ค. printSummary() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด์ž. weak๋Š” ์ฐธ์กฐ ํšŸ์ˆ˜์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Traveler ๊ฐ์ฒด์˜ ref_count๋Š” 0์ด ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค. Account ๊ฐ์ฒด๋Š” Traveler ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด์„œ, ref_count๊ฐ€ 0์ด ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ฐธ์กฐ ์ˆœํ™˜์„ ๋Š์„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. ์ด๋ฒˆ์—” printSummary() ํ•จ์ˆ˜๋ฅผ Account ํด๋ž˜์Šค์— ์ž‘์„ฑํ–ˆ๋‹ค. ๊ณผ์—ฐ ์ž˜ ์‹คํ–‰๋ ๊นŒ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด ๋ณด์ž. ๋๋‹ค๋ฉด ๊ทธ๊ฑด ์šฐ์—ฐ์ด๋‹ˆ๊นŒ ๐Ÿฅฒ

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ์งํ›„ release๋ฅผ ์‚ฝ์ž…ํ–ˆ๋‹ค๋ฉด, Traveler ๊ฐ์ฒด์˜ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋œ๋‹ค.

์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด weak์œผ๋กœ ์ฐธ์กฐ๋œ traveler์€ nil์ด ๋˜๊ณ , Traveler ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค.

์ด๋•Œ printSummary() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด traveler์˜ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘์œผ๋กœ ์ธํ•ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ๐Ÿšจย 
์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ถฉ๋Œ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๋Š” ์กด์žฌํ•œ๋‹ค.

weak, unowned ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

1. withExtendedLifetime()

withExtendedLifetime() ์€ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ์—ฐ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. printSummary() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ Traveler ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ์žฅํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋” ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” defer ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ํ˜„์žฌ ๋ฒ”์œ„์˜ ๋๊นŒ์ง€ ํ™•์žฅํ•˜๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

withExtendedLifetime() ๋ฉ”์†Œ๋“œ๋Š” object lifetimes์˜ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒโ€ฆ fragileํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฑ…์ž„์„ ์ „๊ฐ€ํ•œ๋‹ค. (๐Ÿฅฒ) ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, weak ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค(๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ๋•Œ) ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ํ›จ์”ฌ ๋” ์›์น™์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋” ๋‚˜์€ API๋กœ ํด๋ž˜์Šค๋ฅผ ์žฌ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, ๊ฐ•ํ•œ ์ฐธ์กฐ๋กœ๋งŒ ์ œํ•œํ•˜๋ฉด ๊ฐ์ฒด ์ˆ˜๋ช…์— ๋Œ€ํ•œ ๋ฒ„๊ทธ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Redesign to access via strong reference

printSummary() ํ•จ์ˆ˜๋ฅผ Traveler ํด๋ž˜์Šค์— ์ž‘์„ฑํ•˜๊ณ , Account ํด๋ž˜์Šค์˜ weak ์ฐธ์กฐ๋Š” private์œผ๋กœ ์„ ์–ธํ•˜์—ฌ weak์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

3. Redesign to avoid weak/unowned reference

weak์™€ unowned๋Š” ์ฐธ์กฐ ์ˆœํ™˜์„ ๋Š๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์• ์ดˆ์— ์ฐธ์กฐ ์ˆœํ™˜์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ฒŒ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด ์–ด๋–จ๊นŒ?

Account ํด๋ž˜์Šค๋Š” ์—ฌํ–‰์ž์˜ name ์—๋งŒ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฌํ–‰์ž์˜ name ์„ PersonalInfo ๋ผ๋Š” ์ƒˆ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฐธ์กฐ ์ˆœํ™˜์ด ํ•ด๊ฒฐ ๋œ๋‹ค. ๐Ÿ˜Š

weak ์™€ unowned ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ถ”๊ฐ€ ๊ตฌํ˜„์„ ํ•„์š”๋กœ ํ•˜์ง€๋งŒ ์ž ์žฌ์ ์ธ ๊ฐ์ฒด ์ˆ˜๋ช…์— ๋Œ€ํ•œ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.


Deinitializer side-effects

deinitialize์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๊ธฐ ์ „ ์‹คํ–‰๋œ๋‹ค.

์ด์ „ ์˜ˆ์ œ์™€ ๋™์ผํ•˜์ง€๋งŒ, deinitializer ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

deinitializer ์˜ ์ถœ๋ ฅ์€ ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ARC ์ตœ์ ํ™”์— ๋”ฐ๋ผ Done traveling์ด ์ถœ๋ ฅ๋œ ํ›„์— ์‹คํ–‰๋  ์ˆ˜๋„, ๊ทธ์ „์— ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ๋‹ค.

๋” ๋ณต์žกํ•œ ์˜ˆ์ œ๋ฅผ ํ•œ๋ฒˆ ๋ณด์ž.

TravelMetrics ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  Traveler ํด๋ž˜์Šค์— ์„ ์–ธํ•œ๋‹ค. ๋ชฉ์ ์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค TravelMetrics ๊ฐ์ฒด์— ๊ธฐ๋ก๋˜๊ณ , Traveler ๊ฐ์ฒด๋ฅผ deinitํ•˜๋ฉด TravelMetrics ๊ฐ์ฒด์˜ publish() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. computeTravelInterest() ํ•จ์ˆ˜์—์„œ๋Š” id, ๋ชฉ์ ์ง€ ๊ฐœ์ˆ˜, ๊ด€์‹ฌ ์žˆ๋Š” ์—ฌํ–‰ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

test() ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด์ž. Traveler ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , travelMetric์— Traveler ๊ฐ์ฒด์˜ travelMetrics๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ๋ชฉ์ ์ง€๋กœ Big Sur๊ณผ Catalina๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, Nature ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ traveler์˜ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ์€ ๋ชฉ์ ์ง€ Catalina๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์„ ๋•Œ์ด๋ฉฐ, ์ด ์งํ›„์— deinit์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์—ฌํ–‰ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์ „ deinit์ด ์‹คํ–‰๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


weak , unowned ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ deinitializer ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

1. withExtendedLifetime()

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ withExtendedLifetime() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Traveler ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ์—ฐ์žฅํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ํ•˜์ง€๋งŒโ€ฆ ๊ฐœ๋ฐœ์ž์—๊ฒŒโ€ฆ ์ฑ…์ž„ ์ „๊ฐ€โ€ฆ + ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

2. Redesign to limit visibility of internal class details

private ์œผ๋กœ ์„ ์–ธํ•˜๊ณ  deinit ์‹œ์— computeTravelInterest() , pulish() ์‹คํ–‰ํ•˜๊ธฐ

ํšจ๊ณผ๋Š” ์žˆ์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›์น™์ ์ธ ์ ‘๊ทผ์€ deinitializer์˜ side-effect๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

3. Redesign to avoid deinitializer side-effects

deinitializer์—๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋„ฃ์ง€ ์•Š๊ณ  ๊ฒ€์ฆ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  defer์„ ์‚ฌ์šฉํ•˜์—ฌ computeTravelInterest(), pulish()์„ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์ž ์žฌ์ ์ธ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.


Enable powerful lifetime shortening optimization

Xcode 13์—์„œ๋Š” Optimize Object Lifetimes ๋ผ๋Š” ๋นŒ๋“œ ์„ค์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜๋ช… ๋‹จ์ถ• ARC ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.์ด ๋นŒ๋“œ ์„ค์ •์„ ์ผœ๋ฉด, ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ์งํ›„ ํ›จ์”ฌ ์ผ๊ด€๋˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค.


ARC๊ฐ€ ๋Œ€์ถฉ ์–ด๋–ค ๊ฑด์ง„ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, retain๊ณผ release์— ๋Œ€ํ•ด์„  ์ฒ˜์Œ ์•Œ๊ฒŒ ๋ผ์„œ ๋˜๊ฒŒ ํฅ๋ฏธ๋กœ์› ๋‹ค. ๊ทธ๋ฆฌ๊ณ  weak๋ž‘ unowned๋Š” ๋งˆ๋ƒฅ ์ข‹์€ ์นœ๊ตฌ๋“ค์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์œ„ํ—˜๋„๊ฐ€ ์žˆ๋Š” ์นœ๊ตฌ๋“ค์ด์—ˆ๋‹ค๋‹ˆ ์ถฉ๊ฒฉ ๐Ÿค”

WWDC๋Š” ์•„๋ฌด๋ž˜๋„ ๊ด€์‹ฌ ์žˆ๋Š” ์„ธ์…˜๋ถ€ํ„ฐ ๋จผ์ € ๋ด์„œ ๊ทธ๋Ÿฐ์ง€ ๋‹ค ๋ณด๊ณ  ๋‚˜๋ฉด ๋˜๊ฒŒ ์žฌ๋ฐŒ๋Š” ๊ฒƒ ๊ฐ™๋‹ค! ์ •๋ฆฌํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ๊นŒ์ง€ ๋งŽ์ด ๋Œ๋ ค๋ด์•ผ ํ•˜์ง€๋งŒโ€ฆโ€ฆ ๐Ÿฅฒ


Reference

๐ŸŽ WWDC21 - ARC in Swift: Basics and beyond

0๊ฐœ์˜ ๋Œ“๊ธ€