์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํ๋ฉด์ ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง๋ฅผ ์ํด ์ฌ์ฉํ๊ณ ์์๋
[ weak self ]์ ๋ํด์ ๋ค์ ํ๋ฒ ์๊ฐํด๋ณด๋ ์ข์ ๊ธฐํ๊ฐ ์๊ฒผ๋ค.
1. weak self๋ฅผ ์ฌ์ฉํ๋ ์ด์
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํผํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
Swfit์ ARC๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค.
ํ์ง๋ง ๊ฐ์ฒด๋ค์ด ์๋ก ๊ฐํ๊ฒ ์ฐธ์กฐํ ๊ฒฝ์ฐ, ARC๋ ์ด ์ฐธ์กฐ๋ฅผ ๋์ง ๋ชปํ๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฌํ ์ํฉ์ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด๋ผ๊ณ ํ๋ค.
2. ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ ์ด๋ค ์ํฉ์ ๋งํ๋๊ฑฐ์ง?
๊ฐ์ฒด๋ค์ด ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ค๋ ๊ฒ์, ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ฉด์
๊ทธ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ฒด๋์ง ์๋๋ก ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค๋ ์ํฉ์ ๋งํ๋ค.
Swfit์ ARC๋ ๊ฐ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๋ ํ์๋ฅผ ์ถ์ฒํ๋ฉฐ,
์ด ์ฐธ์กฐ๊ฐ ๋จ์ ์์ผ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ์ง ์๋๋ค.
1) ๋จ์ ์ฐธ์กฐ
๊ฐ์ฒดA๊ฐ ๊ฐ์ฒดB๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ ์ํฉ์ ๊ฐ์ฒด A๊ฐ ๊ฐ์ฒดB๋ฅผ ์์ ํ๋ฉด์
๊ฐ์ฒด B๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋๋ก ํ๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด A๊ฐ ๊ฐ์ฒดB๋ฅผ ์ฐธ์กฐํ ๋ ๊ฐํ ์ฐธ์กฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ํ๋ค.
* Swfit์์ ARC๊ฐ ๊ฐํ์ฐธ์กฐ๊ฐ ๊ธฐ๋ณธ์ธ ์ด์
๊ฐ์ฒด์ ์๋ช ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
๊ฐ์ฒด๊ฐ ์์ ๊ด๊ณ๋ฅผ ๊ฐ์ง ๋ ๊ทธ ์์ ์๊ฐ ๊ฐ์ฒด์ ์๋ช ์ ๋ช ํํ ๊ด๋ฆฌํ๊ฒ ๋๋ฉฐ, ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ์์ ํ๊ฒ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ ์ ์๋ค. ๊ฐ์ฒด์ ์์ ๊ถ์ ๋ช ์ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๋ถ๋ถ๋ช ํ๊ณ ์๊ธฐ์น ๋ชปํ ์ํฉ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ ์๋ ์๋ค.
class A {
var objectB: B?
}
class B {
var name: String
init(name: String) {
self.name = name
}
}
let objectA = A()
let objectB = B(name: "Object B")
objectA.objectB = objectB // A๊ฐ B๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํจ
๊ฐ์ฒด objectB๋ objectA์ ์์ฑ objectB์ ์ํด ์ฐธ์กฐ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋๋ค.
ARC๋ objectA๊ฐ objectB๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ํ objectB๋ฅผ ํด์ ํ์ง ์๋๋ค.
2. ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด
๋ฌธ์ ๋ ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์ด๋ค.
์ด๋ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ์๊ฒจ ARC๊ฐ ์ด ์ฐธ์กฐ๋ฅผ ๋์ง ๋ชปํ๊ณ , ๋ ๊ฐ์ฒด ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๊ฒ!
class A {
var objectB: B?
}
class B {
var objectA: A?
}
let objectA = A()
let objectB = B()
objectA.objectB = objectB // A๊ฐ B๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐ
objectB.objectA = objectA // B๊ฐ A๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐ
์ฌ๊ธฐ์ ๊ฐ์ฒด A๋ ๊ฐ์ฒด B๋ฅผ, ๊ฐ์ฒด B๋ ๊ฐ์ฒด A๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ค.
์ด์ ๋ ๊ฐ์ฒด๋ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์, ARC๊ฐ ์ด ์ฐธ์กฐ๋ฅผ ํด์ ํ์ง ๋ชปํ๊ฒ ๋๋ค. ์ด๋ฅผ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด๋ผ๊ณ ํ๋ค.
์ด ๊ฒฝ์ฐ, ๋ ์ค ํ๋๋ผ๋ ๊ฐํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ํ ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๊ฒ ๋๋ค.
3. ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ?
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฒด๋ค ์ฌ์ด์ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ
์ฝํ ์ฐธ์กฐ(weak self) ๋๋ ๋ฏธ์์ ์ฐธ์กฐ(unowned reference)๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ARC๊ฐ ๊ฐ์ฒด ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๊ฒ ํ ์ ์๋ค.
4. weak์ unknowned ์ฐธ์กฐ
- weak ์ฐธ์กฐ
: ํญ์ ์ต์ ๋๋ก ์ ์ธ๋๋ฉฐ, nil ๊ฐ์ด ๋ค์ด์ฌ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ํฉ์์ ์์ ํ๊ฒ ์ฌ์ฉ.
์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ํด์ ๋๋ฉด ์๋์ผ๋ก nil์ด ํ ๋น ๋๋ค. - unowned ์ฐธ์กฐ
: ๊ฐ์ฒด๊ฐ ๋ฐ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์ ์์ ๊ฒ์ ๋ณด์ฅํ๋ ๊ฒฝ์ฐ์์ ์ฌ์ฉ. nil์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ์ ํ์ ํ ์ ์์ ๋.
5. weak self๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ
weak self๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ๋ ํด๋ก์ ๊ฐ ๊ฐ์ฒด์ ์๋ช ๋ณด๋ค ์งง์ ๋์ด๋ค.
ํด๋ก์ ๊ฐ ์คํ๋๊ณ ๋๋ฉด ๋ฐ๋ก ํด์ ๋๊ฑฐ๋, ํด๋ก์ ๋ด๋ถ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ๊ฐ์ฒด ์๋ช ์ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒฝ์ฐ.
์์)
- ๋น๋๊ธฐ ์์ ์ด ์๊ฑฐ๋, ๊ฐ์ฒด๊ฐ ๋ช ์์ ์ผ๋ก ํด์ ๋๋ ์ํฉ
- ๊ฐ ํ์ (struct, enum)์ ์ฐธ์กฐ ์ฌ์ดํด์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ weak ์ฐธ์กฐ๊ฐ ํ์ ์๋ค.
6. weak์ weak self๋ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ?
weak์ ์ฃผ๋ก ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํฌ ๋ ์ฌ์ฉ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํผํ ์ ์๋ค.
์๋ฅผ๋ค๋ฉด, delegate ํ๋กํผํฐ๋ ๋๊ฒ weak์ผ๋ก ์ ์ธ๋๋ค.
weak self๋ ํด๋ก์ ๋ด๋ถ์์ self๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ์ฉ๋๋ค.
ํด๋ก์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ self๊ฐ ์ํ ์ฐธ์กฐ๋ฅผ ์ ๋ฐํ ์ ์์ ๋ ์ ์ฉํ๋ค.
ํนํ ํด๋ก์ ๊ฐ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๊ณ์์ด ์ค๋ ์ง์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
ํด๋ก์ ์ ์บก์ณ ๊ฐ๋ ์ ํจ๊ป ๊ณต๋ถํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
https://dkswlgus0314.tistory.com/351
* ARC(Automatic Refefence Counting)
Swift๋ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์๋ ์ฐธ์กฐ ์นด์ดํ (ARC)๋ฅผ ์ฌ์ฉํ๋ค.
ARC๋ ์ธ์คํด์ค๊ฐ ๋ ์ด์ ํ์ฉํ์ง ์์ ๋ ๋๋ถ๋ถ ์๋์ผ๋ก ํด๋์ค ์ธ์คํด์ค์ ์ํด ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ํด์ ํ๋ค.
์ฐธ์กฐ ์นด์ดํ ์ ํด๋์ค์ ์ธ์คํด์ค์๋ง ์ ์ฉ๋๋ค.
๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ ์ฐธ์กฐ ํ์ ์ด ์๋๊ณ ๊ฐ ํ์ ์ด๋ฏ๋ก ์ฐธ์กฐ๋ก ์ ์ฅ๋๊ฑฐ๋ ์ ๋ฌ๋์ง ์๋๋ค.
๐ Reference
https://bbiguduk.gitbook.io/swift/language-guide-1/automatic-reference-counting