์์ ์ ์์๋ ๋ฉด์ ์์ ์ํ ์ฐธ์กฐ๊ฐ ์ ์ผ์ด๋๋ ์ํฉ์ ๋ํด ์ง๋ฌธ์ ๋ฐ์ ์ ์ด ์๋ค. ๊ทธ ๋ ๋จ์ํ weak์ strong์ ์ฐจ์ด์ ๋ํด์๋ง ์ค์ค์ด ์์ ๊ธฐ์ต์ด ์๋๋ฐ.. ์ ๋ฆฌ๋ฅผ ์ข ํด์ผ๊ฒ ๋ค ์ถ์๋ค.
ํด๋์ค ์ธ์คํด์ค ์ฌ์ด์ ๊ฐ๋ ฅ ์ํ ์ฐธ์กฐ(Strong Reference Cycle)
: ๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋ก ๊ฐ๋ ฅ ์ฐธ์กฐ๋ฅผ ์ฅ๊ณ ์๋ค๋ฉด, ๊ฐ ์ธ์คํด์ค๋ ์๋ก ์ด๊ฒ ์ ์งํ๋ค.
ex)
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { println("\(name) is being deinitialized") }
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
var tenant: Person?
deinit { println("Apartment #\(number) is being deinitialized") }
}
๊ฐ์์ ํด๋์ค๋ ์๋ก๋ฅผ ์์ฑ์ผ๋ก ์ต์ ๋ ํ์ ์ผ๋ก ๊ฐ์ง๋ค. ์๋์ฒ๋ผ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
var john: Person?
var number73: Apartment?
john = Person(name: "John")
number73 = Apartment(number: 73)
๋ ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๊ณ ํ ๋น ๋ ํ์ ๊ฐ๋ ฅ ์ฐธ์กฐ๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ด๋ค.
์ด์ ๋ ์ธ์คํด์ค๋ฅผ ์ฐ๊ฒฐํ๋๋ก Person๋ apartment๋ฅผ ๊ฐ์ง๊ณ , apartment๋ tenant๋ฅผ ๊ฐ์ง๋๋ก ํ๋ค. ๋๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ๋ ๋ณ์์ธ john๊ณผ number73๋ฅผ ์ธ๋ํํ๊ณ ์ธ์คํด์ค์ ์ ๊ทผํ์ฌ ๊ฐ ์ธ์คํด์ค์ ์์ฑ์ ์ค์ ํ๋ค.
john!.apartment = number73
number73!.tenant = john
์ด ๋ค์ ๋ ๊ฐ์ฒด๋ฅผ nil๋ก ์ค์ ํ ํ ๊ฐ๋ ฅ ์ฐธ์กฐ๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์์๋ณด์.
john = nil
number73 = nil
Person ์ธ์คํด์ค์ Apartment ์ธ์คํด์ค ๊ฐ์ ๊ฐ๋ ฅ ์ฐธ์กฐ๋ ๋์ด์ง์ง ์๊ณ ๋จ์์๋ ๋ชจ์ต์ด๋ค.
ํด๋์ค ์ธ์คํด์ค ๊ฐ์ ๊ฐ๋ ฅ ์ฐธ์กฐ ์ํ ํด๊ฒฐ ๋ฐฉ์
- ์ฝํ ์ฐธ์กฐ (
Weak Reference
)- ์ฝํ ์ฐธ์กฐ๋ ์ธ์คํด์ค๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค ์ฐธ์กฐ๋ฅผ ๊ฐ๋ ฅํ๊ฒ ์ ์งํ์ง ์์ผ๋ฉฐ, ARC๋ ์ฐธ์กฐ๋ ์ธ์คํด์ค๋ฅผ ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋ฉ์ถ์ง ์๊ฒ ํ๋ค.
- ์ฝํ ์ฐธ์กฐ๋ ์์ฑ์ด๋ ๋ณ์ ์ ์ธ ์์
weak
ํค์๋๋ฅผ ์์ ๋๋๋ค. - ์ฐธ์กฐ๊ฐ ์ด๋ ์๊ฐ “๊ฐ ์์”์ ์ฐธ์กฐํ๊ฒ ๋ ๋, ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ ์ํ์ ํผํ๋๋ก ํ๋ค. ์ฐธ์กฐ๊ฐ ๊ฐ์ ํญ์ ๊ฐ์ง๋ค๋ฉด, ๋ฏธ์์ ์ฐธ์กฐ๋ฅผ ๋์ ์ฌ์ฉํ๋ค. ์์ Apartment ์์ ์์ apartment๊ฐ ํน์ ์์ ์ tenant๊ฐ ์์์ ๊ฐ์ง๋ ๊ฒ์ด ์ ํฉํ๋ฉด, ์ฝํ ์ฐธ์กฐ๋ ์ฐธ์กฐ ์ํ์ ๊นจ๋ ์ ํฉํ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฏธ์์ ์ฐธ์กฐ (
Unowned References
)- ์ฝํ ์ฐธ์กฐ์ ๋น์ทํ๊ฒ, ๋ฏธ์์ ์ฐธ์กฐ๋ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐํ๊ฒ ํ์ง ์๋๋ค.
- ์ฝํ ์ฐธ์กฐ์๋ ๋ค๋ฅด๊ฒ ๋ฏธ์์ ์ฐธ์กฐ๋ ํญ์ ๊ฐ์ด ์์์ ๊ฐ์ ํ๋ค. ์ด๋ ๋ฏธ์์ ์ฐธ์กฐ๋ ํญ์ ์ต์
๋์ด ์๋ ํ์
์ผ๋ก ์ ์๋๋ค. ์์ฑ์ด๋ ๋ณ์ ์ ์ธ ์ ์
unowned
ํค์๋๋ฅผ ๋ถ์ธ๋ค. - ๋ฏธ์์ ์ฐธ์กฐ๋ ์ต์ ๋์ด ์๋๊ธฐ ๋๋ฌธ์, ์ฌ์ฉํ ๋๋ง๋ค ๋ฏธ์์ ์ฐธ์กฐ๋ฅผ ์ธ๋ํํ ํ์๊ฐ ์๋ค. ๋ฏธ์์ ์ฐธ์กฐ๋ ํญ์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ ARC๋ ์ธ์คํด์ค ์ฐธ์กฐ๋ฅผ ํ ๋น ํด์ ํ ๋ ์ฐธ์กฐ๋ฅผ nil๋ก ์ค์ ํ ์ ์๋ค. ์ด๋ ์ต์ ๋์ด ์๋ ํ์ ์ ๋ณ์๋ nil๋ก ์ค์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.