[Swift-WWDC21] ARC in Swift: Basics and beyond
ARC in Swift: Basics and beyond
์ค๋์ WWDC21 ์ธ์ ์ค์์ ARC์ ๋ํ ์ธ์ ์ด ์๊ธธ๋ ๋ฒ์ญ์ ํด๋ณด๋ฉด์ ARC๋ฅผ ๋ค์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํด์. ์ค์ญ์ด๋ ์์ญ์ด ์์ ์ ์์ผ๋ ์ด ํฌ์คํธ๊ฐ ์ ํ๊ณผ ์ค์ํํธํ์ ๊ณต์์ ์ธ ๋ฐํ๋ผ๊ณ ์๊ฐํ์ง ๋ง์๊ณ ๊ผญ ์๋ณธ ์์์ ๋ณด์๋ฉด์ ์์ด๊ฐ ์ด๋ ค์ฐ์ ๋ถ๋ถ์์ ์ฐธ๊ณ ๋ง ํด์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ์์! ๊ทธ๋ผ ์์ํ๊ฒ ์ต๋๋ค! ๊ทธ๋์ ๋ ์์ฆ์ ํค๋ ธํธ๋ฅผ ์์ฌ๋ ค์ฃผ๋๋ณด๋ค์ใ
Object Lifetimes and ARC
๋จผ์ ๊ฐ๋ณ๊ฒ ์ค์ํํธ์์ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋๋์ง ์ ๋ฆฌํด๋ณผ๊ฒ์.
๊ฐ์ฒด๋ ์์ฑ์์ ํจ๊ป ์์๋์ด์ ์ฌ์ฉ์ด ์์ ํ ์๋ฃ๋๋ฉด ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ARC๋ ์ด ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ ์ญํ ์ ๋ด๋นํ์ฃ . ARC๊ฐ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํ์ ํ๋ ๋ฐฉ๋ฒ์ด Reference Count์ธ๋ฐ์, ์ค์ํํธ ์ปดํ์ผ๋ฌ๋ ๊ฐ์ฒด๊ฐ ์์๋ ๋ retain ์ฐ์ฐ์๋ฅผ ์ฝ๋์ ์ฝ์ ํ๊ณ , ๊ฐ์ฒด๊ฐ ์ข ๋ฃ๋ ๋ release ์ฐ์ฐ์ ์ฝ๋์ ์ฝ์ ํฉ๋๋ค.
์ด๋ ๊ฒ ํด๋๋ฉด ์ค์ํํธ ๋ฐํ์์ ์ด๋ค ๊ฐ์ฒด์ Reference Count๊ฐ 0์ด ๋์์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํฉ๋๋ค.
๊ธ๋ก๋ ์ ์๋ฟ์ง ์์ฃ ? ๋ฆฌํ ์ธ, ๋ฆด๋ฆฌ์ฆ, ์ปดํ์ผ๋ฌ๊ฐ ์ด์ฉ๊ตฌ.. ๋ฐํ์์ด ์ด์ฉ๊ตฌ..
์์์ ํจ๊ป ์ดํด๋ด ์๋ค.
์, ์ฌ๊ธฐ์ Traveler ํด๋์ค์ ์ด ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ test๋ผ๋ ํจ์๊ฐ ์์ต๋๋ค.
test ํจ์ ์์์๋ traveler1 ์ด๋ผ๋ ๋ณ์์ Traveler ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ค์ด ํ ๋นํ๊ณ , traveler2์ traveler1์ ๊ฐ์ ๋ณต์ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ traveler2 ๋ณ์๊ฐ ๊ฐ์ง ๊ฐ์ ์ ๊ทผํด destination ํ๋กํผํฐ์ ์๋ก์ด ๊ฐ์ ํ ๋นํด์ฃผ๊ณ ์์ต๋๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋ ๊น์? traveler1์ ์ฐธ์กฐ๋ Traveler ์ธ์คํด์ค๋ฅผ ์์ฑ ํ์ ๋ ์์๋๊ณ , traveler2 ์ travler1์ ๋ณต์ฌํ ๋ค์ ์ฌ์ฉ์ด ์ข ๋ฃ๋์ด์.
์ฐธ์กฐ๋ฅผ ํด์ ํ์ง ์์๋๋ฐ ์ END ๋ผ๊ณ ํํํ๋์ง ํท๊ฐ๋ฆฌ์์ฃ ? '์ฌ์ฉ'์ด๋ผ๋ ๊ด์ ์์ ๋ณด์์ ๋, travler1์ ์ฌ์ฉ์ด ์ข ๋ฃ๋๊ฑฐ์์. ์๊น ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ๋ํด ์ ๋ฆฌํ ๋ "์ฌ์ฉ์ด ์๋ฃ๋๋ฉด ์ข ๋ฃ"๋ผ๊ณ ์ ์ ํ์์ด์ ๐
์ด์ ์ปดํ์ผ๋ฌ๋ ๊ฒ์ผ๋ฅธ ์ฐ๋ฆฌ ๋์ ์ ์ฌ์ฉ์ด ์๋ฃ๋ traveler์ ์ฝ๋ ์๋์ release ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
retain์ ์ ์๋๊ตฌ์? ์์ฑ์๋ reference count๋ฅผ 1๋ก ์ค์ ํ๊ฑฐ๋ ์. ๊ทธ๋์ ์ปดํ์ผ๋ฌ๊ฐ ์ด ์ฝ๋์์๋ ๋ฐ๋ก retain์ ๋ฃ์ด์ค ํ์๊ฐ ์์ต๋๋ค.
๋ค์์ ์ด ์ฝ๋์ ํ๋ ๋ ์๋ ๊ฐ์ฒด์ธ traveler2 ๊ฐ์ฒด๋ฅผ ๋ด ์๋ค. ์ด๋ฒ์๋ ์์ฑ์๊ฐ ์๋๋ผ ํ ๋น์ ํตํด์ ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๋ง๋ค์์ฃ ? ์ด ์๊ฐ์ ์ฐธ์กฐ๊ฐ ์์๋๊ณ , destination ํ๋กํผํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ์ฐธ์กฐ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ์ด๋ ๊ฒ retain๊ณผ release ์ฝ๋๋ฅผ ์ฝ์ ํ๊ฒ ๋ฉ๋๋ค.
์ ์ด์ ์ปดํ์ผ๋ฌ์ ์ญํ ์ ๋๋ฌ์ต๋๋ค. ๋ฐํ์์ผ๋ก ์ด๋ํด์ ์ด๋ค ์ผ๋ค์ด ์ผ์ด๋๋์ง ๋ด ์๋ค.
Traveler ๊ฐ์ฒด์ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด์ ํ์ ์ ์ฅ๋์๊ณ , ์ด์ ํจ๊ป Reference count ๊ฐ 1๋ก ์ค์ ๋์์ด์.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ผ์ธ์ ์๋ retain ์ฝ๋๋ฅผ ์คํํ๋ฉด, Reference count๊ฐ ์ฆ๊ฐํด 2๊ฐ ๋์ฃ .
๊ทธ๋ฆฌ๊ณ ์ด์ traveler2๋ Traveler ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
์ด์ traveler1์ ์ฌ์ฉ์ด ๋๋ฌ์ต๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฃ์ด์ค releasae ์ฝ๋๋ฅผ ์คํํ๊ณ , reference count๋ 1๋ก ์ค์ด๋ญ๋๋ค.
๊ทธ ๋ค์์๋ destination ํ๋กํผํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ณ ,
์ด์ traveler2์ ์ฌ์ฉ์ด ๋๋ฌ๋ค์. reference count๋ฅผ ํ๋ ์ค์ด๊ฒ ๋ฉ๋๋ค.
Reference count๊ฐ 0์ด ๋์์ต๋๋ค! ๊ทธ๋ผ ์ด๋๋ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ ์ ์๊ฒ๋ฉ๋๋ค.
์ค์ํ ๋ถ๋ถ์ด๋ผ์ ๋ค์ ์ค๋ช ํด์ฃผ์๋ ๊ฒ ๊ฐ์์! ์ค์ํํธ์ ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ๋ Use-based ์ ๋๋ค. ์ฆ, ์ฌ์ฉ์ ์ธ์ ์์ํ๊ณ ์ข ๋ฃ๋๋์ง์ ๋ฐ๋ผ์ retain๊ณผ release์ ์์ ์ด ๊ฒฐ์ ๋๋ค๋ ๊ฑฐ์์. ์ด๋ฐ ๋ฐฉ์์ C++ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด๋ค๊ณผ๋ ์์ ํ ๋ค๋ฅธ๋ฐ์, ์ค์ํํธ๋ ๋ธ๋ก์ด ์ข ๋ฃ๋ ๋ ๊ฐ์ฒด์ ์ข ๋ฃ๋ฅผ ๋ณด์ฅํ๊ฒ ๋ฉ๋๋ค.
์ค์ํํธ๋ retain๊ณผ release๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด๋ฅผ ํด์ ํ๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ์ข ๋ฃ๋์ง ์์๋ ๊ฐ์ฒด๊ฐ ํด์ ๋ ์ ์์ฃ . ๋ฐฉ๊ธ ์์์์ ๋ณธ ๊ฒ ์ฒ๋ผ์.
๊ทธ๋ฆฌ๊ณ ARC ์ต์ ํ์ ๋ฐ๋ผ์ ์ ๋ฐฉ์์ด ์๋๋ผ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋๊ณ ๊ฝค ์ง๋ ์ดํ์ ๊ฐ์ฒด๊ฐ ํด์ ๋ ์๋ ์์ด์.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ ํํ ์ด๋ป๊ฒ ๋๋์ง ์ค์ํ์ง๋ ์์์. ํ์ง๋ง weak๋ unowned๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ deinitializer๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด์. ์ ์น๊ตฌ๋ค์ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ง์ผ๋ณด๋ ์น๊ตฌ๋ค์ด๊ธฐ ๋๋ฌธ์ ์ ํํ ์ธ์ ํด์ ๋๋์ง๊ฐ ์ค์ํ๋๊น์.
์ด๋ ๊ฒ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์์กด์ ์ธ ์ฝ๋๋ค์ ๋ฒ๊ทธ๊ฐ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ์์ด์. ์ง๊ธ ๋น์ฅ ์ ์คํ๋๋๋ผ๋ ๊ทธ๊ฑด ์ฐ์ฐ(Coincidence)์ด๋๊น์. ๋ง์ฝ ์ปดํ์ผ๋ฌ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ํด๋น ์ฝ๋์ ๊ด๋ จ์ด ์๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ ๋ ์ค๋ ์๊ฐ๋์ ๋ฐ๊ฒฌ๋์ง ์๋ ๋ฒ๊ทธ๊ฐ ๋ฐ๊ฒฌ๋ ์๋ ์๋๊ฑฐ์ฃ .
Observable object lifetimes
์ด์ ์ข ๋ ๋ฅํ๊ฒ ๋ค์ด๊ฐ๋ณผ๊ฒ์. ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด์ฐฐ ๊ฐ๋ฅํ๋๋ก ๋ง๋๋ ์์๋ค์ ์์๋ณผํ ๋ฐ์, ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์์กดํ๋ฉด ์ด๋ค ์ผ๋ค์ด ์ผ์ด๋๋์ง ์์๋ณด๊ณ , ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ์์ ํ ๊ธฐ๋ฒ๋ค๋ ์๊ฐํ ๊ฑฐ์์.
๋จผ์ weak๊ณผ unowned ๋ถํฐ ์๊ฐํ ๊ฒ์. ์ฝํ ์ฐธ์กฐ์ ๋ฏธ์์ ์ฐธ์กฐ๋ reference counting์ ๊ด์ฌํ์ง ์์์. ์ฆ, reference count๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ค๋ ๊ฒ์ด์ฃ . ๊ทธ๋์ ์ด ์น๊ตฌ๋ค์ ์ฐธ์กฐ ์ฌ์ดํด(reference cycle) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ํํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๋ ์์ธํ๊ฒ ์ด์ผ๊ธฐ ํ๊ธฐ ์ ์, ์ฐธ์กฐ ์ฌ์ดํด์ด ๋ฌด์์ธ์ง๋ถํฐ ์ง์๊ตฌ์.
์๊น ๋ง๋ค์๋ Traveler๊ฐ ์กฐ๊ธ ๋ ํ์ฅ๋์์ด์. ์ด์ account๋ผ๋ ํ๋กํผํฐ๊ฐ ์ถ๊ฐ ๋์๊ณ , account๋ฅผ ํํํ๊ธฐ ์ํด์ Account ํด๋์ค๋ ๋ง๋ค์ด์ก์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋์ ์๋ก๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ง๊ณ ์์ด์.
์๋ก์ด test ํจ์๋ ์ถ๊ฐ๋์๋๋ฐ์, ์ฌ๊ธฐ์๋ Traveler ์ธ์คํด์ค์ Account ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ , Traveler ์ธ์คํด์ค์ Account๋ฅผ ํ ๋นํด์ฃผ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ณ ์ข ๋ฃ๋๋ ํจ์์ ๋๋ค.
์ด์ ARC์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ณผ๊น์?
๋จผ์ Traveler ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด์ reference count๊ฐ 1์ธ์ฑ๋ก ์์ฑ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Account ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด์ ์์ ์ reference count๋ฅผ 1๋ก ๋ง๋ค๋ฉฐ ์์ฑ๋๊ณ , ์๋ ์๋ traveler ๋ณ์๋ฅผ ๋ด๋ถ ํ๋กํผํฐ์ ํ ๋นํ๋ฉด์ traveler ๊ฐ์ฒด์ reference count๊ฐ 2๋ก ์ฆ๊ฐํ๊ฒ ๋์ฃ .
๊ทธ๋ฆฌ๊ณ traveler์ account ํ๋กํผํฐ์ ์ ๊ทผํด ์ธ์คํด์ค๋ฅผ ํ ๋นํ์ผ๋ account ๊ฐ์ฒด์ reference count๊ฐ ์ฆ๊ฐํด 2๊ฐ ๋ฉ๋๋ค.
account์ ์ฌ์ฉ์ด ์ข ๋ฃ๋์์ผ๋ traveler.count = account๊ฐ ์๋ฃ๋๋ฉด Account์ ์นด์ดํธ๊ฐ ํ๋ ์ค์ด๋ค๊ณ , ๋ง์ง๋ง์ผ๋ก traveler ๋ณ์์์ printSummary๋ฅผ ํ๋ฉด ์ฌ์ฉ์ด ์๋ฃ๋์ด ์นด์ดํธ๊ฐ ํ๋ ๋ ์ค์ด๋ญ๋๋ค.
์ด์ ๋ ์ธ์คํด์ค์ ์ฌ์ฉ์ด ๋ชจ๋ ์๋ฃ๋์ด์ Reference count๊น์ง ๋ชจ๋ ์ ๋ฆฌ๊ฐ ๋์๋๋ฐ, ํ์ ๋ ์ธ์คํด์ค๋ ์ฌ์ ํ ์นด์ดํธ๋ฅผ 1๋ก ๊ฐ์ง๊ณ ์๋ค์. ์ด๋ฐ ์ํฉ์ ์ฐธ์กฐ ์ฌ์ดํด์ด๋ผ๊ณ ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ธ์คํด์ค๊ฐ ์ ๋ ํด์ ๋์ง ์์ Memory Leak์ ์์ธ์ด ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด weak์ด๋ unonwned ์์ฃ . Reference Count์ ๊ด์ฌํ์ง ์์ผ๋๊น์. weak์ผ๋ก ์ ์ธ๋ ๊ฐ์ฒด๋ ์ฐธ์กฐ๊ฐ ๋์์ ๋ nil์ ๋ฐํํ ์ ์๊ณ , unonwed ๋ ํธ๋ฉ์ ๋ฐ์์์ผ ๋ฐํ์์๋ฌ๋ฅผ ๋ง๋ค๊ฒ๋ฉ๋๋ค.
Account ํด๋์ค์ traveler ํ๋กํผํฐ๋ฅผ weak์ผ๋ก ๋ฐ๊ฟ๋ณผ๊ฒ์.
๋ง์ง๋ง์ผ๋ก traveler๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ฉด Traveler์ ์นด์ดํธ๊ฐ 0์ด ๋๊ฒ ์ฃ ? ์ด์ Account ๋ Traveler๊ฐ ์ฌ๋ผ์ง๋ฉด์ ์นด์ดํธ๊ฐ 0์ด ๋๊ณ ๋ ์ธ์คํด์ค๊ฐ ๋ชจ๋ ์์ ํ๊ฒ ํด์ ๋ฉ๋๋ค.
์ด๋ฒ์ ์ข ๋ค๋ฅธ ์ํฉ์ ํ ๋ฒ ๋ณผ๊ฒ์. ์ด๋ฒ์๋ printSummary๋ฅผ account์์ ํด์ฃผ๊ณ ์์ด์. ์ด์ฉ๋ฉด ์ด ์ฝ๋๋ ์๋ฌด ๋ฌธ์ ์์ด ์ ์คํ๋ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ฐ ์ํฉ์ ๋จ์ํ ์ฐ์ฐ์ผ ๋ฟ์ด์ฃ ..
Traveler ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์ฌ์ฉ๋ ์ดํ์ ์ํฉ์ ์๊ฐํด๋ณผ๊ฒ์.
traveler ๊ฐ์ฒด์ ์ฌ์ฉ์ account๊ฐ printSummary ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํจ์๊ฐ ํธ์ถ๋๊ธฐ ์ ์ Traveler ์ธ์คํด์ค์ ์นด์ดํธ๊ฐ 0์ด ๋์ด์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ์๋ ์๋ ๊ฒ์ด์ฃ .
๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด weak ์ผ๋ก ์ ์ธ๋ ํ๋กํผํฐ์๋ nil์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
์ด๋ฐ ์ํฉ์์ traver.name์ ๊ฐ์ ์ธ๋ํํด์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ํฌ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฌผ๋ก ์ต์ ๋ ๋ฐ์ธ๋ฉ์ผ๋ก ํฌ๋์๋ ํด๊ฒฐํ ์ ์์ง๋ง, ํฌ๋์๋ง ์๋ ๋ฟ ์ด๋ฐ ์ฝ๋๋ ์ฌ์ ํ ๋ฒ๊ทธ์ ๋๋ค.
์ด๋ฒ์๋ weak๊ณผ unowned๋ฅผ ๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ธฐ์ ์ธ withExtendedLifetime์ ์๊ฐํ๊ฒ ์ต๋๋ค.
์ค์ํํธ๋ withExtendedLifetime์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋๋ฐ์, ๋ช ์์ ์ผ๋ก ํน์ ํ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ์์์ฒ๋ผ ์ฌ์ฉํ๋ฉด, traveler ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๊ฐ printSummary๊ฐ ๋๋ ๋๊น์ง๋ก ์ฐ์ฅ๋์ฃ .
ํจ์ ์ค์ฝํ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ ๊ฐ์ ํจ๊ณผ๋ฅผ ์ป์ ์๋ ์์ต๋๋ค.
๋ ๋ณต์กํ ์ํฉ์์๋ defer ์์ withExtendedLifetime์ ๋ฃ์ด์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.(์.. ์ฌ๊ธฐ์ ์๋ฆ๋์์ด์..)
์ด ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ๋ํ ๋ฒ๊ทธ๋ฅผ ์ก์ ์ ์์ง๋ง, ๋จ๋จํ ๊ธฐ์ ์ ์๋๋๋ค(fragile์ด๋ผ๊ณ ํ์ จ๋๋ฐ ํ์ ์ด ๋ง๋ค๊ณ ํด์ํ ์ ์์ ๊ฒ ๊ฐ์์.). ๊ทธ๋ฆฌ๊ณ ARC๊ฐ ํ๋ ์ฑ ์์ ๊ฐ๋ฐ์์๊ฒ ๋ ๋๊ธฐ๊ฒ ๋์ฃ .
์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋์ ์ฐพ์๊ฐ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๊ณ , ์ด๊ฑด ๋๋ฌด ํฐ ์ ์ง๋น์ฉ์ ์๊ตฌํฉ๋๋ค.
๋ ์ข์ ๋ฐฉ๋ฒ์ ํด๋์ค๋ฅผ ๋ ๋์ API๋ค๋ก ์ค๊ณํ๋๊ฑฐ์์.
๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ง์ฝ ๊ฐ์ฒด์ ์ด๋๊ฐ์์ ์ ๊ทผ์ ๋ฐ๋ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ๊ฐํ ์ฐธ์กฐ๋ผ๋ฉด ์๋ฐฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด ์ฝ๋์์๋ printSummary๋ฅผ ๋ค์ traveler๋ก ์ฎ๊ฒจ์ฃผ์์ด์. ๊ทธ๋ฆฌ๊ณ Account์ traveler ์ธ์คํด์ค๋ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ์จ๊ฒจ์ฃผ์์ต๋๋ค.
์ด์ printTest ๋ฉ์๋๋ ๋ฐ๋์ Account๋ฅผ ํตํด์๋ง ํธ์ถ์ด ๋์ด์ผ ํ๊ณ ์ด๊ฒ์ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํด์ค๋๋ค.
๋จ์ํ ์ฑ๋ฅ์ ์ด์๋ฅผ ๋ ๋์ weak์ด๋ unowned๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ๋ค์ ํด๋์ค๋ฅผ ์ ์คํ๊ฒ ์ค๊ณํด์ผํฉ๋๋ค.
weak ์ด๋ unowned๊ฐ ์ ํ์ํ์ง, ๋จ์ํ ์ฐธ์กฐ ์ฌ์ดํด์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ง ์ฌ์ฉํ๊ณ ์๋์ง ์๊ฐํด๋ณด์ธ์. ์ฐธ์กฐ ์ฌ์ดํ์ ํด๋์ค๋ค์ ์ํ๊ด๊ณ๋ฅผ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ณํํ๋ ๊ฒ์ ํตํด์ ํด๊ฒฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฐ๋ฆฌ์ ์์์์๋ Traveler ํด๋์ค๊ฐ Account ํด๋์ค๋ฅผ ์ฐธ์กฐํด์ผํฉ๋๋ค. ํ์ง๋ง ์ฌ์ค Account ํด๋์ค๋ Traveler ํด๋์ค์ ์ฌ์ฉ์ ์ ๋ณด์๋ง ์ ๊ทผํ๋ฉด ๋์ฃ .
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ Traveler ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ PersonalInfo๋ผ๋ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ํด๋์ค๋ฅผ Traveler์ Account๋ ์ด ์๋ก์ด ํด๋์ค๋ฅผ ์ฐธ์กฐํ๊ธฐ๋ง ํ๋ฉด ๋์ฃ . ์ด ๊ณผ์ ์์ Account ํด๋์ค๋ ๋์ด์ Traveler ํด๋์ค๋ฅผ ์ฐธ์กฐํ์ง ์์๋ ๋๊ณ , ์ฐธ์กฐ์ฌ์ดํด ๋ฌธ์ ๊ฐ weak์ด๋ unowned๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์์ฐ์ค๋ฝ๊ฒ ํด์๋ฉ๋๋ค.
์ด๋ ๊ฒ ํด๋์ค๋ฅผ ๋ค์ ๋์์ธํ๊ฒ ๋๋ฉด ๊ตฌํ๋น์ฉ์ด ๋ ๋ฐ์ํ๊ฒ ๋ ๊ฑฐ์์. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ์ ๊ด๋ จ๋ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ฐ์ฅ ํ์คํ ๋ฐฉ๋ฒ์ด ๋ฉ๋๋ค.
๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ Deinitializer์ ๊ด๋ จ๋ ๋ฌธ์ ์ ๋๋ค. Deinitializer๋ ๊ฐ์ฒด๊ฐ ํด์ ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋๋ฐ์, ์ด๋ฒ์๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ค์ด ์์ต๋๋ค.
๋ฒ๊ทธ์ ๋ํด์ ๋ ์์ธํ ๋ณด๊ธฐ์ ์, Deinitializer๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ์ดํด๋ณด์๊ตฌ์.
์๊น์ ๊ฐ์ ์์ ์ด์ง๋ง ์ด๋ฒ์๋ Deinitializer๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋๊ฑด ์๋ง Done traveling ์ดํ์ Deinitializer๊ฐ ํธ์ถ๋์ด์ ์ถ๊ฐ์ ์ธ ์ถ๋ ฅ์ด ๋์ค๋ ๊ฒ์ด๊ฒ ์ฃ ?
ํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ Deinitializer๊ฐ "Done Traveling"์ด์ ์ ์ถ๋ ฅ๋ ์๋ ์์ต๋๋ค. ์๋ํ๋ฉด traveler2 ๊ฐ์ฒด์ ์ฌ์ฉ์ด ์ถ๋ ฅ๋ฌธ ์ด์ ์ ๋๋ฌ์ผ๋๊น์.
์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ธ๋ถ์ ์ํฅ์ ์ฃผ์ง๋ ์์ผ๋๊น ํฐ ๋ฌธ์ ๋ ์๊ฒ ์ฃ ? ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
๋ ๋ณต์กํ ์ผ์ด์ค์ ๋๋ค. ์ด์ TravelMetrics๋ผ๋ ์ธ๋ถ ํด๋์ค์ ๋ํ ์์กด์ฑ์ด ์ถ๊ฐ๋์์ด์. Traveler๊ฐ์ฒด๋ ํด์ ๋๋ฉด์ ์ด TravelMetrics๊ฐ์ฒด์ publish๋ฅผ ํธ์ถํ๊ณ ์ด๋ traveler์ ๋ํ ์ ๋ณด๊ฐ ๋ฐํ๋๋ ๊ตฌ์กฐ์ ๋๋ค.
ํ ์คํธ ํจ์์์. ๊ฐ ๊ฐ์ฒด๋ฅผ ์ค์ ํ ๋ค์ ๋ชฉ์ ์ง๋ฅผ ์ค์ ํ๊ณ computeTravelInterest๋ฅผ ํธ์ถํ๋ฉด, ์ ๋ฐ์ดํธํ ๋ชฉ์ ์ง์ ๋ฐ๋ผ ์นดํ ๊ณ ๋ฆฌ๊ฐ ๋ถ์ฌ๋๋ ์๋๋ฆฌ์ค์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ ๋ชฉ์ ์ง๋ฅผ ๋ฃ์๊ณ ์ด์ ๋ํด์ Natrue๋ผ๋ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์์ฑ๋๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
ํ์ง๋ง ์ค์ ๋ก traveler ๊ฐ์ฒด์ ์ฌ์ฉ์ ๊ณ์ฐ์ ํธ์ถํ๋ ํจ์ ์ด์ ์ ์ข ๋ฃ๋๊ณ , ์ด๋ deninitializer๊ฐ ํธ์ถ๋๋ฉด์ publish ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
์์ง computeTravelInterest๊ฐ ์คํ๋์ง ์์์ ์นดํ ๊ณ ๋ฆฌ๊ฐ ๋ถ์ฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์นดํ ๊ณ ๋ฆฌ์ nil์ด ๋ค์ด๊ฐ๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ฏธ ์ค๋ช ํ๋ ๊ฒ ์ฒ๋ผ withExtendedLifetime ์ ์ฌ์ฉํ ์ ์๊ฒ ์ง๋ง, ์ด๋ฐ ๋ฐฉ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ์ฑ ์์ ๊ฐ๋ฐ์์๊ฒ ๋งก๊ธฐ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ํญ์ withExtendedLifetime์ ์ ์ ํ๊ณ ํ์คํ๊ฒ ์์ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฒ์๋ ๋ก์ง์ ์ฌ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์๊ฒ ์ฃ ? denitializer์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ถ์ฌํ๋ ํจ์๋ฅผ publish์ ํจ๊ป ๋ฃ์ ์ ์๊ฒ ์ง๋ง ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์๋๋๋ค.
์ด๋ฒ์ ์๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ deinitializer์๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ๋ฃ์ง ์๋ ๊ฒ์ ๋๋ค. ๋์ ํ ์คํธ ํจ์์ defer๋ฅผ ๋ฃ์ด์ ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ํธ์ถํด์ค ์ ์์ฃ . ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ด ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์์กดํ์ง ์๋๋ค๋ฉด ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์๊ฒ๋ฉ๋๋ค.
XCode13์ ์ค์ํํธ ์ปดํ์ผ๋ฌ ์ธํ ์ Optimize Object Lifetime์ ๋ํ ์ต์ ํ๊ฐ ์ถ๊ฐ๋์์ด์. ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ค์ด ์ฌ์ฉ์ด ๋๋ฌ์ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ๊ฒ์ด ๋ ์ผ๊ด์ฑ์๊ฒ ์ง์๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋ช ์ฃผ๊ธฐ์ ๊ด๋ จํ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ค์ ๋ ์ฝ๊ฒ ๋ฐ๊ฒฌํ ์ ์๊ฒ ๋๊ฒ ์ฃ !
๋!
๋ง๋ฌด๋ฆฌ
๋ณด๋ ๋ด๋ด ๋๋ฌด ์ ์ตํ๊ณ ์ฌ๋ฏธ์๋ ์ธ์ ์ด์์ด์..! ARC์ ๋ํด์ ์ ๋ชจ๋ฅธ๋ค๊ณ ๋๋๊ฒ ์ ๋ ๊ทธ๋ฅ ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ ์ฝ๋ ๋ค์ release๊ฐ ๋ค์ด๊ฐ๋ ์ค ์์๊ฑฐ๋ ์.. ๊ทผ๋ฐ Use-Based ์๋ค๋ ๊ฒ์ ์์ง ๋ฐฐ์ธ๊ฒ ๋ ๋ง๋ค๊ณ ๋๊ผ์ต๋๋ค.. ๊ทธ๋ฆฌ๊ณ ์ ํ ๊ฐ๋ฐ์๋ค์ ์ฐ์ํ defer ์ฌ์ฉ๋ ๊ทธ๋ ๊ณ .. ๋ฌด์ง์ฑ weak, unowned๊ฐ ์๋๋ผ ์ค๊ณ๊ฐ ๋ง๋์ง ๊ณ ๋ฏผํด๋ณด๋ผ๋ ๋ง๋ ์์ฃผ์์ฃผ ์ธ์์ ์ด์์ต๋๋ค.
๊ทธ๋ฅ ๋น๋ ์๋๊ณ nil ์๋์จ๋ค๊ณ ์์ฌํ์ง ๋ง๊ณ ์ง์ง ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๊ฐ ์๋์ง ์๊ฐ์ ์ ํด๋ด์ผ๊ฒ ์ด์!
๊ทผ๋ฐ ์๊ฐํด๋ณด๋๊น ๊ฒฐ๊ตญ ARC๋ ์ด๊ฒ์ ๊ฒ ๋ค ์ค๋ช ํ๊ฒ XCode13์ ์ค์ํํธ ์ปดํ์ผ ์ต์ ํ ์๋ก ๋ง๋ค์ด์ง๊ฑฐ ํ๋ณดํ๋ ค๊ณ ๋น๋์ ํ์ ๊ฒ ๊ฐ์์ใ ใ ใ
๋ฐํํด์ฃผ์ ๋ถ์ด ์ค์ํํธ ์ปดํ์ผ๋ฌ ์์ง๋์ด์ด์ ๋ฐ ์ง์ง ๋ฉ์ง๋ค์.. ๋๋ ์ ๋ฐ ๋น์ทํ ์์ค๊น์ง ๊ฐ ์ ์๋ ๋ ์ด ์ฌ๊น..
์ค๊ฐ์ค๊ฐ์ ์ ์๊ฐ๋ ๋ค์ด๊ฐ๊ณ ํด์ ์ด์ํ ๋ด์ฉ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์!
'๐ ์์ด-์ค-์์ค > ๐ค ์ค์ํํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] strong, weak, unowned์ ๋น๋ฐ (1) | 2022.01.23 |
---|---|
[Swift] Method Dispatch ๋ฐํ์๋ฃ (2) | 2021.12.28 |
[Swift] Method Dispatch (3): Dynamic Dispatch๋ฅผ ์ค์ฌ๋ณด์ (0) | 2021.12.26 |
[Swift] Method Dispatch (2): ๋ ๋ณต์กํ ์ํฉ์ Method Dispatch (0) | 2021.12.26 |
[Swift] Method Dispatch (1): Static Dispatch vs. Dynamic Dispatch (1) | 2021.12.26 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote