์ ๋ฒ ๊ธ์์๋ ARC์ ๊ฐ๋ ์ ๋ํด ์์๋ดค๋๋ฐ,
์ค๋์ ARC๊ฐ ์ ๋๋ก ์๋ํ ์ ์๊ฒ ๋๋ ์ด์ ์ ๋ํด์ ๊ณต๋ถํ๊ณ
๊ทธ๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ ์ํฉ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์๋ ํ๋ก๊ทธ๋จ์ด ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ ์ ํ๊ณ ์๋ ํ์์ด๋ค.
iOS์ฑ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ด๊ฒ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๊ณ , ๊ฒฐ๊ตญ์ ์ฑ์ ์ฃฝ์ผ ์ ์๋ค.
์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ ์์ธ์ ๋ํด ์ดํด๋ณด์.
๐ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ ์์ธ - Retain Cycle (๊ฐํ์ฐธ์กฐ ์ํ)
์ ๋ฒ ๊ธ์์ ๋งํ๋ฏ swift์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ARC๊ฐ ์๋์ผ๋ก ์ํํด์ฃผ๊ณ ,
ARC๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ ๋์ ํด์ ์์ผ์ค๋ค.
์ฐธ์กฐ์ ์ข ๋ฅ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ,
์ฐ๋ฆฌ๊ฐ ํด๋์ค ํ์ ์ ํ๋กํผํฐ๋ ๋ณ์, ์์ ๋ฑ์ ์ ์ธํ ๋
๋ณ๋์ ์๋ณ์๋ฅผ ๋ช ์ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ผ๋ก '๊ฐํ์ฐธ์กฐ'๋ฅผ ํ๊ฒ ๋๋ค.
(์ง๊ธ๊น์ง ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ var tmp = ~~ ์ด๋ ๊ฒ ์ ์ธํ๋ ๊ฒ๋ค ๋ชจ๋ ๊ฐํ์ฐธ์กฐ์๋๊ฒ,,)
๊ทธ๋ฐ๋ฐ ๋ณตํฉ์ ์ผ๋ก ์ฐธ์กฐ๊ฐ ์ผ์ด๋๋ ์ํฉ์์, ๊ฐํ ์ฐธ์กฐ๋ฅผ ์๋ชป ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ธ์คํด์ค๋ผ๋ฆฌ ์๋ก๊ฐ ์๋ก๋ฅผ ๊ฐํ ์ฐธ์กฐํ ๋๊ฐ ๋ํ์ !!!๐ฅ
์ด ๋ฌธ์ ๋ฅผ ๋ฐ๋ก Retain Cycle, ๊ฐํ์ฐธ์กฐ ์ํ์ด๋ผ๊ณ ํ๋ค.
์๋์ Retain Cycle์ด ์ผ์ด๋๋ ๋ํ์ ์ธ ์ฌ๋ก๋ฅผ ์์ฑํ๋ค.
class Example_A {
var A: Example_B?
init() {
print("being initialized")
}
deinit {
print("being deinitialized")
}
}
class Example_B {
var B: Example_A?
init() {
print("being initialized")
}
deinit {
print("being deinitialized")
}
}
var test1: Example_A? = Example_A() // Example_A ์ฐธ์กฐ ํ์ : 1 (Prints "being initialized")
var test2: Example_B? = Example_B() // Example_B ์ฐธ์กฐ ํ์ : 1 (Prints "being initialized")
test1?.A = test2 // Example_B ์ฐธ์กฐ ํ์ : 2
test2?.B = test1 // Example_A ์ฐธ์กฐ ํ์ : 2
test1 = nil // Example_A ์ฐธ์กฐ ํ์ : 1
test2 = nil // Example_B ์ฐธ์กฐ ํ์ : 1
Example_A, Example_B ํด๋์ค๋ฅผ ์์ฑํ๊ณ , ๊ฐ ํด๋์ค๋ฅผ ์ฐธ์กฐํ๋ test1, test2 ๋ณ์๋ฅผ ์ ์ํ๋ค.
์ฒ์ ์ฐธ์กฐ๋ฅผ ์ ์ํ์ ๋ being initialized๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋จ์ ํ์ธํ ์ ์๊ณ ,
์ด ๋ Example_A์ Example_B ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๋ 1์ฉ ์ฆ๊ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ๋ก, ๋ ๋ณ์์ ๊ฐ๊ฐ ์ฐธ์กฐํ๋ ํด๋์ค์ ํ๋กํผํฐ๊ฐ ์๋ก์ ์ฐธ์กฐ ํด๋์ค๋ฅผ ์ฐธ์กฐํ๋๋ก ํ๋ค.
์ด ๋ ๋ ํด๋์ค์ ์ธ์คํด์ค ์ฐธ์กฐ ํ์๋ ๋๋ค์ 1์ฉ ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ์ฐธ์กฐ ํ์๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋ ๊ฒ๊น์ง์๋ ๋ฌธ์ ๊ฐ ์๋ค.
์ด์ ์ฐธ์กฐ ํ์๋ฅผ ํ๋์ฉ ๊ฐ์์์ผ๋ณด์.
test1 ๋ณ์์ nil์ ํ ๋นํ๋ฉด test1์ด ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ธ Example_A์ ์ฐธ์กฐ ํ์๋ 1 ๊ฐ์ํ๋ค.
๐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ์ํด์๋ ์ฐธ์กฐ ํ์๋ฅผ 0๊น์ง ๊ฐ์์์ผ์ค์ผ ํ๋๋ฐ,
์ด๋ ๊ฒ ๋๋ฉด test1 ๋ณ์๋ฅผ ํตํด Example_A์ ์ธ์คํด์ค ์ฐธ์กฐ ํ์๋ฅผ ๊ฐ์์ํค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํด์ง๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ test2๊ฐ ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ B ํ๋กํผํฐ๋ก Example_A๋ฅผ ์ฐธ์กฐํด๋จ์ผ๋ฏ๋ก..!!!
์ด ๊ฒฝ๋ก๋ฅผ ํตํด Example_A์ ์ฐธ์กฐ ํ์๋ฅผ ์ค์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ์ํฌ ์ ์๋ค. ๋ฐ๋ผ์ ์์ง์ ๋ฌธ์ ์์.!
ํ์ง๋ง ์ฌ๊ธฐ์ test2์๋ nil์ ํ ๋นํด๋ฒ๋ฆฌ๋ฉด ์ด ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.โ๏ธ
1) ์ ์ผํ๊ฒ Example_A ํด๋์ค์ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ผ์ง
2) nil ํ ๋น์ผ๋ก Example_B ์ธ์คํด์ค ์ฐธ์กฐ ํ์ 1์ด ๊ฐ์๋์ง๋ง, ๋์ด์ ๊ฐ์์ํฌ ์ ์๋ ๊ฒฝ๋ก๋ ์์
๋ฐ๋ผ์ Example_A, Example_B ์ธ์คํด์ค ๋ชจ๋ ์ฐธ์กฐ ํ์๊ฐ 1์ธ์ฑ๋ก
์๋ก์ด ์ฐธ์กฐ ํ์์ ๊ฐ์๊ฐ ๋ถ๊ฐ๋ฅํ๊ฒ ๋์์ผ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ๋ฐฉ๋ฒ์ด ์ฌ๋ผ์ง๊ฒ๋๋ค.
๐ ์ธ์คํด์ค๊ฐ ์ฐธ์กฐ ํ์๋ฅผ ๋จ๊ฒจ๋ ์ฑ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ข๋น์ฒ๋ผ ๋จ์์๊ฒ ๋จ. ๋ฉ๋ชจ๋ฆฌ ๋์!!!
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฌผ๋ก ์ฐ๋ฆฌ๊ฐ ์ข ๋ ์ ๊ฒฝ์ ์จ์..!
์๋์๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ง์ง ์๊ฒ, ์์ฐจ์ ์ผ๋ก nil์ ํ ๋นํด์ฃผ๋ฉด ๊ฐ๋ฅ์ํ๋ค.
test1?.A = nil
test1 = nil
test2?.B = nil
test2 = nil
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ์ค์ํ ๊ฐ๋ฅ์ฑ๋ ์ปค์ง๊ณ , ํ๋กํผํฐ๊ฐ ๋๋ฌด ๋ง์์ง ๊ฒฝ์ฐ์ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ธ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ผ๊ฒ ์ง,.!
๐ Retain Cycle ํด๊ฒฐ (1) - Weak Reference (์ฝํ์ฐธ์กฐ)
์ฝํ์ฐธ์กฐ๋ ๊ฐํ์ฐธ์กฐ์ ๋ฌ๋ฆฌ, ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ค.
์ด ์ฝํ์ฐธ์กฐ๋ ์ด๋ป๊ฒ ์ฐ๋๊ฑด์ง, ์ด๋ป๊ฒ ๋์ํ๋์ง ์ฝ๋๋ก ํ์ธํด๋ณด์.
class Example_A {
var A: Example_B?
init() {
print("being initialized")
}
deinit {
print("being deinitialized")
}
}
class Example_B {
weak var B: Example_A?
init() {
print("being initialized")
}
deinit {
print("being deinitialized")
}
}
var test1: Example_A? = Example_A() // Example_A ์ฐธ์กฐ ํ์ : 1 (Prints "being initialized")
var test2: Example_B? = Example_B() // Example_B ์ฐธ์กฐ ํ์ : 1 (Prints "being initialized")
test1?.A = test2 // Example_B ์ฐธ์กฐ ํ์ : 2
test2?.B = test1 // Example_A ์ฐธ์กฐ ํ์ : 1
test1 = nil // Example_A ์ฐธ์กฐ ํ์ : 0, Example_B ์ฐธ์กฐ ํ์ : 1 (Prints "being deinitialized")
print(test2?.B) // Prints "nil"
test2 = nil // Example_B ์ฐธ์กฐ ํ์ : 0 (Prints "being deinitialized")
์์์ ๊ฐํ์ฐธ์กฐ๋ก ์ธํ Retain Cycle ์์ ์ ๋์ผํ๊ฒ ํด๋์ค๋ฅผ ์ ์ธํ๊ณ ์ฐธ์กฐํ๋ค.
test1, test2๋ก ํด๋์ค๋ฅผ ์ฐธ์กฐํ ๋ถ๋ถ๊น์ง๋ ์์ ์์ ์ ๊ฐ์๋ฐ, ๊ทธ ์๋๋ถํฐ๋ ์กฐ๊ธ์ฉ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค.
test2?.B์ test1์ ํ ๋นํ์ ๋์ ์ฃผ์์ ๋ณด๋ฉด, Example_A์ ์ฐธ์กฐ ํ์๋ ์ฆ๊ฐ๋์ง ์๋๋ค.
๊ทธ ์ด์ ๋ test2๊ฐ ์ฐธ์กฐํ๋ Example_B์ ํ๋กํผํฐ B๋ฅผ
weak ํค์๋๋ฅผ ์ด์ฉํ์ฌ Example_A๋ฅผ ์ฝํ์ฐธ์กฐํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์์ ๋งํ๋ฏ ์ฝํ์ฐธ์กฐ๋ฅผ ํ๊ฒ๋๋ฉด ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ์ฐธ์กฐํ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ค.๐ฅ
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ ๊ฐ ๋ณ์์ nil์ ํ ๋นํ๋ฉฐ ์ธ์คํด์ค ํด์ ๋ฅผ ์์ํ๋๋ฐ,
test1์ nil์ ํ ๋นํ ๋ถ๋ถ์ ํ์ธํ๋ฉด Example_A์ Example_B์ ์ฐธ์กฐ ํ์ ๋ชจ๋ ๊ฐ์ํ ๊ฒ์ ๋ณผ ์ ์๋ค.
Q) Example_A๋ฅผ ์ฐธ์กฐํ๋ test1์๋ง nil์ ํ ๋นํ์ ๋ฟ์ธ๋ฐ ์ Example_B๊น์ง ์ฐธ์กฐ ํ์๊ฐ ๊ฐ์ํ์๊น?
๊ทธ ์ด์ ๋ ์ด๋ป๊ฒ ์๊ฐํด๋ณด๋ฉด ๋๊ฒ ๋น์ฐํ๋ฐ,
Example_A ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด ์์ฐ์ค๋ Example_A์ ํ๋กํผํฐ์ธ A ๋ํ ์ญํ ์ด ๋๋๊ฒ ๋๊ณ ,
A๋ Example_B๋ฅผ ๋์ด์ ๊ฐํ์ฐธ์กฐํ์ง ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ Example_B์ ์ฐธ์กฐ ํ์๊น์ง ๊ฐ์๋๋๊ฒโ๏ธ
๐์ ๋ฆฌํ์๋ฉด, ์ด๋ค ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด ๊ทธ์ ๋์์
๊ทธ ์ธ์คํด์ค์ ํ๋กํผํฐ๊ฐ ๊ฐํ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๊น์ง 1 ๊ฐ์ํ๊ฒ๋๋ค.
์ถ๊ฐ๋ก, ์ด ๋ ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํ ์ ์๋ ์ฝํ์ฐธ์กฐ์ ํน์ง์ด ํ๋ ์๋ค.
์ด ๋ถ๋ถ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด test2?.B์ ๊ฐ์ด nil์ด๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋
Example_A ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋จ์ผ๋ก ์ธํด ํ๋กํผํฐ B๋ ์ฐธ์กฐํ๋ ๋์์ด ์ฌ๋ผ์ง๊ฒ ๋์๊ณ ,
B๋ ์ฝํ์ฐธ์กฐ๋ฅผ ํ๋ฏ๋ก ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์์ผ๋ ์๋์ผ๋ก nil์ ํ ๋นํ ๊ฒ์ด๋ค.
+ ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๋ ์ ์ ์๋ ์ ์,
์ฝํ์ฐธ์กฐ๋ฅผ ํ๋ฉด ์์๊ฐ์ด ๋ด๊ฐ ๋ชจ๋ฅด๋ ์ฌ์ด ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ํด์ ๋์ด์์ ์ ์๊ณ ,
๊ทธ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก nil์ด ํ ๋น๋ ์ ์์ผ๋ฏ๋ก ํด๋น ํ๋กํผํฐ๋ 'nil'๋ก '๋ณํ '์ ์์ด์ผํ๋ค.
๋ฐ๋ผ์ ์ฝํ์ฐธ์กฐ๋ฅผ ํ๋ ํ๋กํผํฐ์ ๊ฒฝ์ฐ ๊ผญ ์ต์ ๋ ๋ณ์๋ก ์ ์ธ๋์ด์ผํ๋ค.๐ฅ
๐์ ๋ฆฌ! ์ฝํ์ฐธ์กฐ๋ฅผ ํ๋ ํ๋กํผํฐ๋ ์์ ์ด ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด
์๋์ผ๋ก nil์ ํ ๋นํ๋ฉฐ, ๊ผญ ์ต์ ๋ ๋ณ์๋ก ์ ์ธํด์ผํ๋ค.
์ด๋ ๊ฒ ์ฝํ์ฐธ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํจ์ผ๋ก ์ธํด ๊ฐํ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํ์ง๋ง ๋ฐฉ๋ฒ์ด ์ฝํ์ฐธ์กฐ ํ๋๋ง ์๋๊ฒ์ ์๋!
๐ Retain Cycle ํด๊ฒฐ (2) - Unowned Reference (๋ฏธ์์ ์ฐธ์กฐ)
๋ฏธ์์ ์ฐธ์กฐ๋ํ ์ฝํ์ฐธ์กฐ์ฒ๋ผ ์ฐธ์กฐ ํ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋ ์ฐธ์กฐ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๋์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์,
๋ฏธ์์ ์ฐธ์กฐ์ ๊ฒฝ์ฐ ๋ด๊ฐ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๊ผญ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ ๊ฒ์ด๋ผ๋ ์ ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ๊ฒ์ด๋ค.
๋ง๋ก๋ ๋๋ฌด ์ด๋ ค์ฐ๋,, ์ฝ๋๋ก ํ์ธํด๋ณด์!
import Foundation
class Person {
let name: String
var car: Car? // ์ฌ๋์ ์ฐจ๋ฅผ ๊ฐ์ง์ง ์์๋ ๋จ => ๊ฐํ ์ฐธ์กฐ, ์ต์
๋๋ก ์ ์ธ
init(name: String) {
self.name = name
print("\(name) being initialized")
}
deinit {
print("\(name) being deinitialized")
}
}
class Car {
let name: String
unowned var owner: Person // ์ฐจ๋ ๊ผญ ์ฃผ์ธ์ด ์์ด์ผ ํจ => ๋ฏธ์์ ์ฐธ์กฐ๋ก ์ ์ธ
init(name: String, owner: Person) {
self.name = name
self.owner = owner
print("\(name) being initialized")
}
deinit {
print("\(name) being deinitialized")
}
}
var seolhee: Person? = Person(name: "seolhee") // Person ์ธ์คํด์ค ์ฐธ์กฐ ํ์ : 1 (Prints "seolhee being initialized")
if let person: Person = seolhee {
person.car = Car(name: "tivoli", owner: person) // Car ์ธ์คํด์ค ์ฐธ์กฐ ํ์ : 1 (Prints "tivoli being initialized")
// Person ์ธ์คํด์ค ์ฐธ์กฐ ํ์ : 1
}
seolhee = nil // Person ์ธ์คํด์ค ์ฐธ์กฐ ํ์ : 0, Car ์ธ์คํด์ค ์ฐธ์กฐ ํ์ : 0 (Prints "seolhee being deinitialized", "tivoli being deinitialized")
์ด ๋ฏธ์์ ์ฐธ์กฐ๋ ์ด๋ฆ์ฒ๋ผ '์์ '์ ๊ด๊ณ๋ฅผ ์๊ฐํ๋ฉด ํธํ๋ค.
๋๋ ์ฐจ์ ๊ทธ ์ฐจ์ฃผ์ ๊ด๊ณ๋ฅผ ์์๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ, ์ฌ๋์ ์ฐจ๊ฐ ์์ ์ ์์ง๋ง ์ฐจ๋ ์ฌ๋์ด ๊ผญ ํ์ํ๋ค.
๋ฐ๋ผ์ Car ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Person ์ธ์คํด์ค๊ฐ ๊ผญ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํด์ผ๋ง ํ๋ค.!!
์์ ์ด์ผ๊ธฐ๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๋๋ฅผ ์ดํด๋ณด์. ๋จผ์ ํด๋์ค ๊ตฌํ๋ถ!
(1) Person ํด๋์ค์ car ํ๋กํผํฐ๋ Car ํด๋์ค๋ฅผ ๊ฐํ์ฐธ์กฐํ๋ฉฐ ์ต์ ๋๋ก ์ ์ธํ๋ค.
์ฌ๋์ ์ฐจ๋ฅผ ๊ฐ์ง์๋, ๊ฐ์ง์ง ์์ ์๋ ์์ผ๋ฏ๋ก ์ต์ ๋๋ก ์ ์ํ์ผ๋ฉฐ
์ฐจ๋ฅผ ํ ๋ฒ ๊ฐ์ง ํ์๋ ํจ๋ถ๋ก ์์ด๋ฒ๋ฆฌ๋ฉด ์๋๋ฏ๋ก ๊ฐํ์ฐธ์กฐ๋ฅผ ํ๋๋ก ํ๋ค.
(2) Car ํด๋์ค์ owner ํ๋กํผํฐ๋ unowned ํค์๋๋ฅผ ์ด์ฉํด ๋ฏธ์์ ์ฐธ์กฐํ๋ค.
์ฐจ๋ ์์ ์ฃผ๊ฐ ๊ผญ ์์ด์ผ ์กด์ฌํ ์ ์์ผ๋ฏ๋ก ์ต์ ๋๋ก ์ ์ํ์ง ์์๊ณ ,
์ฐจ๊ฐ ์๋ ํ ๋น์ฐํ ์์ ์ฃผ๋ ์กด์ฌํ๋ค๋ ํ์ ์ด ์์ผ๋ฏ๋ก ๋ฏธ์์ ์ฐธ์กฐํ๊ฒ ํ๋ค.
ํด๋์ค ๊ตฌํ ํ ๊ฐ์ฅ ๋จผ์ Person์ ์ฐธ์กฐํ๋ seolhee๋ฅผ ์ ์ํ๊ณ , Person ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๋ 1 ์ฆ๊ฐํ๋ค.
๊ทธ๋ฆฌ๊ณ if let ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ Person ์ธ์คํด์ค๊ฐ ์กด์ฌํ๋ฉด! Car์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ์์ฑํด์ฃผ์๋ค.
(Person ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ์์ด์ผ๋ง Car์ธ์คํด์ค ๋ํ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ!๐ฅ)
์ด ๋ Car ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๋ 1 ์ฆ๊ฐํ๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ฒ๋๋ค.
ํ์ง๋ง ์ด ๋ ์ฃผ๋ชฉํด์ผ ํ ์ ์, Car์ ownerํ๋กํผํฐ๊ฐ Person์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ฒ๋์์ง๋ง
๋ฏธ์์ ์ฐธ์กฐํ์ผ๋ฏ๋ก Person ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๋ ์ฆ๊ฐํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ฝํ์ฐธ์กฐ์์ ๊ณตํต์ !
๋ง์ง๋ง์ผ๋ก๋ seolhee ๋ณ์์ ๋ค์ nil์ ํ ๋นํด์ฃผ์๋ค.
์ด ๋ ๋น์ฐํ Person ์ธ์คํด์ค๋ ์ฐธ์กฐ ํ์๊ฐ 1 ๊ฐ์ํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๊ณ
Car ์ธ์คํด์ค์ ๊ฒฝ์ฐ ์ฝํ์ฐธ์กฐ ๋ถ๋ถ์์ ๊ณต๋ถํ๋๋ก, Person ์ธ์คํด์ค๊ฐ ํด์ ๋จ์ ๋ฐ๋ผ
Person์ ํ๋กํผํฐ car๊ฐ ๊ฐํ์ฐธ์กฐํ๋ Car ์ธ์คํด์ค ๋ํ ์ฐธ์กฐ ํ์๊ฐ 1 ๊ฐ์ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ Car๊น์ง ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ์๋ฃ!
์ด๋ ๊ฒ ๋ฏธ์์ ์ฐธ์กฐ๋ฅผ ์ด์ฉํ๋ฉด
์์ ์ฒ๋ผ ์ฌ๋์ด ์์ด์ง๋ฉด ์ฐจ๋ ์์ด์ ธ์ผ ํ๋ ์ด๋ฐ ์ํฉ์ ์ฝ๊ฒ ํํํ ์ ์๊ณ
๊ฐํ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ ํผํด๊ฐ ์ ์๊ฒ๋๋ค.โ๏ธ
๐ ์ ๋ฆฌ
Retain Cycle์ ๊ฐํ์ฐธ์กฐ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ก,
์ด๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๊ณ ์ฑ์ ์น๋ช ์ ์ธ ์ํฅ์ ๋ผ์น ์ ์๋ค.
๊ฐํ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ ์ฝํ์ฐธ์กฐ๋ ๋ฏธ์์ ์ฐธ์กฐ๋ฅผ ์ด์ฉํ์ฌ ํด๊ฒฐ์ด๊ฐ๋ฅํ๋ฐ,
์ฐธ์กฐ๋ฅผ ํ๋ฉด ๋ฌด์กฐ๊ฑด ์ฐธ์กฐ ํ์๊ฐ 1 ์ฆ๊ฐ๋๋ ๊ฐํ ์ฐธ์กฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝํ์ฐธ์กฐ์ ๋ฏธ์์ ์ฐธ์กฐ๋ ๋ชจ๋ ์ฐธ์กฐ ํ์๋ฅผ ์ฆ๊ฐ์ํค์ง์์ผ๋ฉฐ,
์ฝํ์ฐธ์กฐ๋ ๋ด๊ฐ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์์ ๊ฒฝ์ฐ
์๋์ผ๋ก nil์ ํ ๋นํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ์ต์ ๋ ๋ณ์๋ก ์ ์ธํด์ผํ๊ณ ,
๋ฏธ์์ ์ฐธ์กฐ๋ ๋ด๊ฐ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ฌด์กฐ๊ฑด ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ ๊ฒ์ด๋ผ๋ ์ ์ ํ์ ์ฌ์ฉํ๋ ์ฐธ์กฐ์ด๋ฏ๋ก
์ต์ ๋ ๋ณ์๋ก ์ ์ธํ์ง ์์๋ ๋๋ค.
์ฐธ๊ณ
- ๐ ์ค์ํํธ ํ๋ก๊ทธ๋๋ฐ
'3๏ธโฃ Swift > Swift ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ARC (1); ARC์ ๊ฐ๋ , Retain Count (3) | 2021.09.23 |
---|---|
[Swift] ํ๋กํผํฐ ๊ฐ๋ ์ ๋ฆฌ (3); ํ์ ํ๋กํผํฐ (2) | 2021.09.22 |
[Swift] ํ๋กํผํฐ ๊ฐ๋ ์ ๋ฆฌ (2); ์ฐ์ฐ ํ๋กํผํฐ (0) | 2021.09.22 |
[Swift] ํ๋กํผํฐ ๊ฐ๋ ์ ๋ฆฌ (1); ์ ์ฅ ํ๋กํผํฐ (0) | 2021.09.22 |
[Swift] ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ์ด์ , ๊ฐ ์บก์ณ(Capturing Value) (0) | 2021.09.11 |
๋๊ธ