-
Strong Reference Cycle - MemoryiOS/๐ Swift 2021. 1. 3. 22:26
"๊ฐํ ์ฐธ์กฐ ์ํ"
ARC์ ์๋ ๋ฐ ๊ฐํ ์ฐธ์กฐ์ ๊ท์น์ ์ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ์ด์์ ๋๋ค.
ARC์ ๊ด๋ จ๋์์ผ๋ฏ๋ก ์ฐธ์กฐ ํ์ ์ฌ์ด์์ ๋ฐ์ํฉ๋๋ค. (class, closure)
๋ฐ์ ์์
๊ฐ๋ฐ์๊ฐ ์ธ์คํด์ค์ nil์ ํ ๋นํ๋ ๊ฒฝ์ฐ๋ ์ธ์ ์ผ๊น์?
์ธ์คํด์ค๊ฐ ๋ ์ด์ ์ฐธ์กฐํ ํ์๊ฐ ์์ด์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํค๊ณ ์ถ์ ๊ฒฝ์ฐ์ผ ๊ฒ์ ๋๋ค.
์๋๋ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ํด์ ์์ง๋ง, ์ธ์คํด์ค๊ฐ ํด์ ๋์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์์๊ณผ ๋์์ ์ ๊ทผ๋ ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๊น๋๋ค.
๋ฐ๋ก ๊ฐํ ์ฐธ์กฐ ์ํ์ด ๋ฐ์ํ ๊ฒฝ์ฐ์ ๋๋ค.
ํ์
์ธ์คํด์ค์ ์ธ์คํด์ค ์ฌ์ด(์ด๋ฒ ๊ธ), ์ธ์คํด์ค์ ๊ทธ ์ธ์คํด์ค์ ์์ฑ์ ์ ์ฅ๋ ํด๋ก์ ์ฌ์ด
์ฝ๋
์ธ์คํด์ค๊ฐ ์๋ก ๊ฐํ ์ฐธ์กฐ ํ๋ ๊ฒฝ์ฐ, ์ธ์คํด์ค์ nil์ ๋ฃ์ด๋ ์ธ์คํด์ค์ ์์ฑ์ด ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ์บก์ฒํ๊ณ ์๊ธฐ ๋๋ฌธ์
์ฐธ์กฐ ํ์ (Reference Counting)์ด 0์ด ๋์ง ์์์ ์ ๊ทผ ํ์ง ๋ชปํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋ ๊ฒฝ์ฐ์ ๋๋ค.
์๋์ ์ฝ๋๋ฅผ ์๋ก ๋ณด๋ฉด, kim ์ room ์์ฑ์ด Room ์ธ์คํด์ค๋ฅผ ์บก์ฒํ๊ณ ์๊ณ , room์ person ์์ฑ์ด vice versa๋ก ์บก์ฒํ๊ณ ์์ต๋๋ค.
์ดํ kim ๊ณผ room ์๋ nil์ ํ ๋นํ์ฌ ์ฐธ์กฐ ํ์๋ฅผ ๊ฐ์์์ผฐ์ง๋ง, ์ ์ ๊ทธ ์ธ์คํด์ค๋ค์ ์์ฑ์ด ์บก์ฒํ๊ณ ์๊ธฐ ๋
๋ฌธ์ ์ฐธ์กฐ ํ์๋ 1์ด๊ณ , ARC์ ์ํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์์ต๋๋ค.
class Person { ... var room: Room? ... } class Room { ... 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 ์ฐธ์กฐ ํ์ : 2 kim?.room = room // R.I ์ฐธ์กฐ ํ์ : 2 kim = nil // P.I ์ฐธ์กฐ ํ์ : 1 room = nil // R.I ์ฐธ์กฐ ํ์ : 1 // ์ด ํ kim, room ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์์ง๋ง, ARC์์ํด ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๊ฒ ๋จ
๋.
๋ค์ ๊ธ: Weak Reference - Memory
'iOS > ๐ Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Memberwise Initializer - Initializer (0) 2021.01.05 Initializers - Initializer (0) 2021.01.05 Weak Reference - Memory (0) 2021.01.02 [Swift] self ๋ ์ด๋ ์์ ๋ถํฐ ์ฌ์ฉํ ์ ์์๊น? (2) 2021.01.01 Strong Reference - Memory (0) 2020.12.31