๐ก ์ด ๊ธ์ WWDC21์ ARC in Swift: Basics and beyond ์ธ์ ์ ๋ณด๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Swift๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๊ฐ ํ์ ์ ์ ๊ณตํ๋ค. ์๋ํ์ง ์์ ์ค์๋ค์ ํผํ๊ธฐ ์ํด(์ฐธ์กฐ ํ์ ์ ํน์ฑ ๐ฅฒ) ๊ฐ๋ฅํ๋ฉด ๊ฐ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ํด๋์ค๋ Swift์ ์ฐธ์กฐ ํ์ ์ด๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ๋ฉด Swift๋ 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์ด ๋์์ผ๋ฏ๋ก ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ค.
Swift ๊ฐ์ฒด์ ์๋ช ์ use-based์ด๋ค. ๊ฐ์ฒด์ ๋ณด์ฅ๋ ์ต์ ์๋ช (guaranteed object lifetimes)์ ์ด๊ธฐํ๋ถํฐ ๋ง์ง๋ง ์ฌ์ฉ๊น์ง์ด๋ค.
์ด์ ์์ ์์ ๊ฐ์ฒด๊ฐ ๋ง์ง๋ง ์ฌ์ฉ ์งํ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ๊ฒ์ ๋ณด์๋ค.
๊ฐ์ฒด์ ์๋ช
์ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ์
ํ retain
๊ณผ release
์ ์ํด ๊ฒฐ์ ๋๋ค.
ํ์ง๋ง ARC ์ต์ ํ์ ๊ฐ์ ์ด์ ๋ก, ๊ฐ์ฒด์ ๋ง์ง๋ง ์ฌ์ฉ์ด ์ง๋ ๋ค์์ ํด์ ๋ ์๋ ์๋ค.
์ฌ์ค, ๋๋ถ๋ถ ๊ฐ์ฒด์ ์ ํํ ์๋ช
์ ์ค์ํ์ง ์๋ค. ํ์ง๋ง weak
, unowned
์ฐธ์กฐ๋ deinitializer
๋ฅผ ์ธ ๋ ์ฃผ์๊ฐ ํ์ํ๋ค. ๐จ
์ด๋ค์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ์๋ช ์ observeํ ์ ์๋๋ฐ, guaranteed object lifetimes๊ฐ ์๋ observed object lifetime์ ์์กดํ๊ฒ ๋๋ฉด, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ค๋๋ ์๋ ํตํ ์ ์์ง๋ง, ์ฌ์ค ๊ทธ๋ฅ ์ฐ์ฐ์ ์ผ์น์ด๋ค. (โฆ๋งต๋คโฆ ๐ฅฒ) Observed object lifetimes์ ๋ฒ๊ทธ๋ ๊ฐ๋ฐ ์ค์ ๋ฐ๊ฒฌ๋์ง ์๊ณ ์ค๋ซ๋์ ์ฐพ์ง ๋ชปํ ์๋ ์๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ฐ์ดํธ๋๊ฑฐ๋ ์์ค๊ฐ ๋ฐ๋๋ฉด ๊ฐ์๊ธฐ ๋ฐ๊ฒฌ๋ ์๋โฆ
์ด์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์์ธํ ์ดํด๋ณด์.
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
์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค.
withExtendedLifetime()
์ ๊ฐ์ฒด์ ์๋ช
์ ์ฐ์ฅํ ์ ์๋ ๋ฉ์๋์ด๋ค. printSummary()
ํจ์๊ฐ ํธ์ถ๋ ๋ Traveler
๊ฐ์ฒด์ ์๋ช
์ ์์ ํ๊ฒ ์ฐ์ฅํ์ฌ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ค. ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด๋ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๋ ๋ณต์กํ ๊ฒฝ์ฐ์๋ defer
์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์๋ช
์ ํ์ฌ ๋ฒ์์ ๋๊น์ง ํ์ฅํ๋๋ก ์ปดํ์ผ๋ฌ์ ์์ฒญํ ์ ์๋ค.
withExtendedLifetime()
๋ฉ์๋๋ object lifetimes์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ณด์ด์ง๋งโฆ fragileํ๊ณ ์ฌ์ฉ์์๊ฒ ์ฑ
์์ ์ ๊ฐํ๋ค. (๐ฅฒ) ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด, weak
๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค(๋ฒ๊ทธ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์์ ๋) ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ฐ๋ผ์, ํจ์ฌ ๋ ์์น์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ ๋์ API๋ก ํด๋์ค๋ฅผ ์ฌ์ค๊ณํ๋ ๊ฒ์ด๋ค. ๋ํ, ๊ฐํ ์ฐธ์กฐ๋ก๋ง ์ ํํ๋ฉด ๊ฐ์ฒด ์๋ช
์ ๋ํ ๋ฒ๊ทธ ๋ฐ์์ ๋ฐฉ์งํ ์ ์๋ค.
printSummary()
ํจ์๋ฅผ Traveler
ํด๋์ค์ ์์ฑํ๊ณ , Account
ํด๋์ค์ weak
์ฐธ์กฐ๋ private
์ผ๋ก ์ ์ธํ์ฌ weak
์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํ์ฌ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ค.
weak
์ unowned
๋ ์ฐธ์กฐ ์ํ์ ๋๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ์ด์ ์ฐธ์กฐ ์ํ์ด ์์ฑ๋์ง ์๊ฒ ํด๋์ค๋ฅผ ์ค๊ณํ๋ฉด ์ด๋จ๊น?
Account
ํด๋์ค๋ ์ฌํ์์ name
์๋ง ์ ๊ทผํ๋ฉด ๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ฌํ์์ name
์ PersonalInfo
๋ผ๋ ์ ํด๋์ค๋ก ์ฎ๊ธธ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฐธ์กฐ ์ํ์ด ํด๊ฒฐ ๋๋ค. ๐
weak
์ unowned
์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ถ๊ฐ ๊ตฌํ์ ํ์๋ก ํ์ง๋ง ์ ์ฌ์ ์ธ ๊ฐ์ฒด ์๋ช
์ ๋ํ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ ํ์คํ ๋ฐฉ๋ฒ์ด๋ค.
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
๋ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก withExtendedLifetime()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Traveler
๊ฐ์ฒด์ ์๋ช
์ ์ฐ์ฅํ์ฌ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ค. ํ์ง๋งโฆ ๊ฐ๋ฐ์์๊ฒโฆ ์ฑ
์ ์ ๊ฐโฆ + ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ ๋๋ง๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
private
์ผ๋ก ์ ์ธํ๊ณ deinit
์์ computeTravelInterest()
, pulish()
์คํํ๊ธฐ
ํจ๊ณผ๋ ์์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก ์์น์ ์ธ ์ ๊ทผ์ deinitializer
์ side-effect๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๋ ๊ฒ์ด๋ค.
deinitializer
์๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋ ๋ฃ์ง ์๊ณ ๊ฒ์ฆ๋ง ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ defer
์ ์ฌ์ฉํ์ฌ computeTravelInterest()
, pulish()
์ ์คํํ์ฌ ๋ชจ๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ค.
Xcode 13์์๋ Optimize Object Lifetimes ๋ผ๋ ๋น๋ ์ค์ ์ ์ฌ์ฉํ ์ ์๋ค. ์๋ช ๋จ์ถ ARC ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.์ด ๋น๋ ์ค์ ์ ์ผ๋ฉด, ๋ง์ง๋ง ์ฌ์ฉ ์งํ ํจ์ฌ ์ผ๊ด๋๊ฒ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ค.
ARC๊ฐ ๋์ถฉ ์ด๋ค ๊ฑด์ง ์๊ณ ์์๋๋ฐ, retain๊ณผ release์ ๋ํด์ ์ฒ์ ์๊ฒ ๋ผ์ ๋๊ฒ ํฅ๋ฏธ๋ก์ ๋ค. ๊ทธ๋ฆฌ๊ณ weak๋ unowned๋ ๋ง๋ฅ ์ข์ ์น๊ตฌ๋ค์ธ ์ค ์์๋๋ฐ ์ํ๋๊ฐ ์๋ ์น๊ตฌ๋ค์ด์๋ค๋ ์ถฉ๊ฒฉ ๐ค
WWDC๋ ์๋ฌด๋๋ ๊ด์ฌ ์๋ ์ธ์ ๋ถํฐ ๋จผ์ ๋ด์ ๊ทธ๋ฐ์ง ๋ค ๋ณด๊ณ ๋๋ฉด ๋๊ฒ ์ฌ๋ฐ๋ ๊ฒ ๊ฐ๋ค! ์ ๋ฆฌํ๊ณ ์ดํดํ๊ธฐ๊น์ง ๋ง์ด ๋๋ ค๋ด์ผ ํ์ง๋งโฆโฆ ๐ฅฒ