-
Weak Reference - MemoryiOS/๐ Swift 2021. 1. 2. 20:48
" ์ฝํ ์ฐธ์กฐ "
๊ฐํ ์ฐธ์กฐ ์ํ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋ ์ ๋๋ค.
์ฐธ์กฐ ํ์ ์ ๋ณ์์ ์ ์ธ ์์ 'weak' ํค์๋๋ฅผ ์จ์ฃผ์ด์ ๊ตฌํํฉ๋๋ค.
๊ฐํ ์ฐธ์กฐ์ ๋ฌ๋ฆฌ ์ฝํ ์ฐธ์กฐ๋ ์ธ์คํด์ค๋ฅผ ์์ ( retain ) ํ์ง ์๊ณ ์ฐธ์กฐ ( refer ) ๋ง ํฉ๋๋ค.
๋ฐ๋ผ์ ARC ๋ชจ๋ธ์ reference counting์ ์ฆ๊ฐ์ํค์ง ์์ต๋๋ค.
๋ํ ๋์ค์ reference counting์ด 0 ์ด ๋์ด ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ ์ ์๋๋ฐ, ์ด ๋๋ nil๋ก ์ด๊ธฐํ ๋ฉ๋๋ค.
๊ธฐ์กด์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด์ผ ํ๊ธฐ ( instance ์ฃผ์ - > nil ) ๋๋ฌธ์ ๋ณ์ ( var ) ์ฌ์ผ ํ๊ณ , nil์ ๋ด์ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ต์ ๋์ด์ฌ์ผ ํฉ๋๋ค.
์ข ํฉ์ ์ผ๋ก, weak ํค์๋๋ ์ต์ ๋ ์ฐธ์กฐ ํ์ ์ ๋ณ์ ์์๋ง ์ ์ธํ ์ ์์ต๋๋ค
class Person { ... var room: Room? ... } class Room { ... weak var person: Person? ... deinit { print("deinit") } } var kim: Person? = Person() // Person Instance (์ดํ P.I) ์ฐธ์กฐ ํ์ : 1 var room: Room? = Room() // Room Instance (์ดํ R.I) ์ฐธ์กฐ ํ์ : 1 room?.person = kim // P.I ์ฐธ์กฐ ํ์ : 1 ( ์ฝํ ์ฐธ์กฐ ) kim?.room = room // R.I ์ฐธ์กฐ ํ์ : 2 kim = nil // P.I ์ฐธ์กฐ ํ์ : 0, R.I ์ฐธ์กฐ ํ์ : 1 room = nil // R.I ์ฐธ์กฐ ํ์ : 0 // "deinit"
์ถ๊ฐ์ ์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ฉด ์ธ์คํด์ค์ ํ๋กํผํฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐํ ์ฐธ์กฐ (์ฌ๊ธฐ์๋ kim์ room ์ ์ฅ์์ฑ) ๋ ์ฌ๋ผ์ง๋๋ค. ์ด ๋ reference counting์ด 1 ๊ฐ์ํฉ๋๋ค.
๋.
'iOS > ๐ Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Initializers - Initializer (0) 2021.01.05 Strong Reference Cycle - Memory (0) 2021.01.03 [Swift] self ๋ ์ด๋ ์์ ๋ถํฐ ์ฌ์ฉํ ์ ์์๊น? (2) 2021.01.01 Strong Reference - Memory (0) 2020.12.31 ARC - Memory (0) 2020.12.30