ARC
ARC ๋ชฉ์ฐจ
Swift์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ
๊ฐ ํ์๊ณผ ์ฐธ์กฐ ํ์์ ๋น๊ต
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (์ฝ๋, ๋ฐ์ดํฐ, ํ, ์คํ)
์ธ์ด ๋ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ
ARC ์๋ ์๋ฆฌ
ARC์ MRC
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋์
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด๋?
ํด๊ฒฐ ๋ฐฉ์
์์ ์ฝ๋
Swift์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ
๋ณต์ต) ๊ฐ ํ์๊ณผ ์ฐธ์กฐ ํ์
๊ฐ ํ์ (Value Type)
Baisic Type, ํํ, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, ์ปฌ๋ ์ ๋ฑ์ด ํด๋น๋๋ค.
Stack ์์ญ์ ๊ฐ์ด ์ ์ฅ๋๋ค.
ํ์์์๋ ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค.
์ฌ์ฉ์ด ๋๋๋ฉด, Stackํ๋ ์์์ ์์์ ์ ๊ฑฐ๋๋ฏ๋ก ๋ณ๋๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ ํ์ ์๋ค.
์ฐธ์กฐ ํ์ (Reference Type)
ํด๋์ค, ํด๋ก์ ๊ฐ ํด๋น๋๋ค.
ํ์์์ ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ค. (Heap์ ์ฃผ์๋ฅผ Stack์ ์ ์ฅ)
Heap ์์ญ์ ์ค์ ๊ฐ๋ค์ด ์ ์ฅ๋๋ค.
**RC(Reference Counting, ์ฐธ์กฐ ์นด์ดํ )**์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
Swift์์ ์ฌ์ฉํ๋ ARC ๋ชจ๋ธ
๋ณต์ต) ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ - ์ฝ๋ฐํ์ค
์ฝ๋์์ญ
CPU๊ฐ ์คํํ ์ ์๋ ์ค์ง์ ๋ช ๋ น์ด๋ค์ด ๋ชจ์ฌ์๋ ๊ณต๊ฐ (๋ชจ๋ ์ฝ๋, ํ๋ก๊ทธ๋จ์ด ์กด์ฌ)
get Only
์ฝ๋์์ญ์ ํ์ํ ๋ฐ์ดํฐ๋ค์ด ๋ฐ์ดํฐ, ํ, ์คํ ์์ญ์ ์ ์ฅ๋์ด์๋ค.
๋ฐ์ดํฐ = ์ ์ญ ๋ณ์, ํ์ ์์ฑ ๋ฑ ๊ณตํต์ผ๋ก ๊ณต์ ๋๋ ๋ฐ์ดํฐ
ํ = ๋์ ํ ๋น์ผ๋ก ํฌ๊ธฐ๊ฐ ํฌ๊ณ , ๊ด๋ฆฌํ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ
์คํ = ํจ์ ์คํ์ ์ํ ์์ ๊ณต๊ฐ
๋ฐ์ดํฐ ์์ญ
๊ณตํต์ผ๋ก ๊ณต์ ํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์ ์ญ ๋ณ์, ํ์ ์์ฑ์ ์ ์ฅํ๋ค.
๋ถ์ด๋นต ํ์ด ์ ์ฅ๋์ด ์๋ค.
์ฑ์ด ์คํ๋๋ ๋์์ ๋ถ๋ณ์ ์ฑ์ง์ ๊ฐ๋๋ค.
ํ ์์ญ
์ธ์คํด์ค๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ๋ค. (๋์ ํ ๋น)
์ผ๋ฐ์ ์ผ๋ก ๊ธด ์๊ฐ๋์ ์ ์ฅํ๋ค.
ํ์ฐ์ ์ผ๋ก ๋๋ฆด ์๋ฐ์ ์๋ค.
๊ด๋ฆฌํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ด ๋ฐ์ํด ์ฑ์ด ์ข ๋ฃ๋ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ํ์(Memory Leak): ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๊ฑฐ๋์ง ์๋ ํ์
๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํด์ฃผ์ด์ผํ๋ค.
์คํ ์์ญ
ํจ์ ์คํ์ ์ํ ์์์ ๊ณต๊ฐ์ด๋ค.
ํฌ๊ธฐ๊ฐ ์๊ณ ๋น ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ค.
์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์ธ์ด ๋ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ
์๋ฐ์ GC (Garbage Collector)
๋ฐํ์์ ํ ์์ญ์ ์๋์ผ๋ก ์ค์บํด์ ์์์ ๊ด๋ฆฌํด์ค
์ค์บํ๋ ์๋๊ฐ ์์ด์ ๋๋ ค์ง! (์ธ์ ์ด๋ ์์ ์ ์ด๋ฃจ์ด์ง๋์ง๋ ์ ์ ์์)
objective - c
์ฐธ์กฐ ์ซ์(RC)๋ฅผ ์ธ๋ ๊ฒ์ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ / ์ปดํ์ผ ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ์์ ๊ฒฐ์
์๋์ผ๋ก ์ซ์ ์ธ๋ ๊ฒ์ด MRC (๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๊ณ์ฐ)
์๋์ผ๋ก ์ซ์ ์ธ๋ ๊ฒ์ด ARC
์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ฝ๋๋ฅผ ์ฌ์ด์ค โ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์์์ ํด์ฃผ๋๊ฒ ์๋๊ณ ์ซ์๋ฅผ ์ ๋๋ก ์ธ ์ค๋ค๋๊ฒ์! ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ์ ๋๋๋ก, ์ด๋ก ์ ์ ์๊ณ ์ฌ์ฉํด์ผํจ.
Swift
ARC (Automatic RC)
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
ARC ์๋ ์๋ฆฌ
ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ARC๋ ์ธ์คํด์ค์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
์ธ์คํด์ค, ๊ด๋ จ ํ๋กํผํฐ ๊ฐ, ์ธ์คํด์ค ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
์ธ์คํด์ค๊ฐ ๋์ด์ ํ์ํ์ง ์์ผ๋ฉด, ARC๋ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ํด์ ํ๋ค. โ ํด๋์ค ์ธ์คํด์ค๊ฐ ํ์ํ์ง ์์ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ์ง ์๋๋ค.
์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ค๋ฉด, ARC๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ํด์ ํ์ง ์๋๋ค. โ ์ด๋ฅผ ์ํด ํด๋์ค ์ธ์คํด์ค๋ฅผ ํ ๋นํ ๋๋ง๋ค ๊ฐํ ์ฐธ์กฐ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ์ฐธ์กฐ๋ ํด๋น ์ธ์คํด์ค๋ฅผ ์ ์งํ๊ณ , ๊ฐํ ์ฐธ์กฐ๊ฐ ๋จ์์๋ ํ ํ ๋น ํด์ ๋ฅผ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐํ ์ฐธ์กฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ARC์ MRC
ARC(Automatic RC)
class Point {
var x, y: Double
func draw() {}
}
let point1 = Point(x: 0, y: 0)
let point2 = point1
point2.x = 5
//use point1
//use point2
MRC
class Point {
**var refCount: Int**
var x, y: Double
func draw() {}
}
let point1 = Point(x: 0, y: 0)
let point2 = point1
**retain(point2)**
point2.x = 5
//use point1
**release(point1)**
//user point2
**release(point2)**
์ด์ ์ธ์ด๋ค์ MRC์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ค.
ํ๋ ์ธ์ด์ ๊ฒฝ์ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค.
์ปดํ์ผ๋ฌ๊ฐ retain() โ release() ํด์ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ค๊ณ ์๊ฐ
์ด์ ์ธ์ด๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ๊ด๋ฆฌํ์ (MRC)
ํ๋ ์ธ์ด์ ๊ฒฝ์ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ ์ฌ์ฉ
Swift๋ ์ปดํ์ผ๋ฌ๊ฐ
retain()
ํ ๋น ์ฝ๋ โrelease()
ํด์ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ค๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ์ค์๋ฅผ ๋ฐฉ์งํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ด ์ฆ๊ฐ๋๋ค.
ARC ๊ธฐ๋ฐ
๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ ์๊ฐ ์์ผ๋ฉด ํด์ ๋๋ค๋ ์์น์ ๊ฐ์ง๊ณ ์๋ค.
์์ ์ ์ฑ
ํ๋ ์ด์์ ์์ ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋จ
์ฐธ์กฐ ์นด์ดํ
๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ ์ ์นด์ดํ
ARC ๋์
์ด๋ป๊ฒ ์๋ ์ฐธ์กฐ ์นด์ดํ ์ด ๋์ํ๋๊ฐ?
class Person {
let name: String
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
var soi: Person? = Person(name: "์ง์") // retain(soi), RC: 1
var reference: Person?
var reference = Person(name: "John") // retain(reference), RC: 2
soi = nil // release(soi), RC: 1
reference = nil // release(reference), RC: 0
์์ ์ธ์ด์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๋ค์ด ์๋ ๊ด๋ฆฌํ๋ค. (retain, release)
ํ๋์ ์ธ์ด๋ ๋๋ถ๋ถ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉฐ, Swift์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ retain() โ release()์ฝ๋๋ฅผ ์ฝ์ ํ๋ค๊ณ ๋ณด๋ฉด๋๋ค.
ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ์์ ์ฑ์ด ์ฆ๊ฐํ๋ค.
์ฐธ์กฐ ์ฌ์ดํด๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋์
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด๋?
ํด๋์ค์ ์ ์ฅ์์ฑ์ ํน์ ์ธ์คํด์ค๋ฅผ ์๋ก ์ฐธ์กฐํ๋ ๊ฒ์ด๋ค.
Stack ์์ญ์์๋ ์ฌ๋ผ์ก์ง๋ง, RC๊ฐ 1๋ก ์ ์ฅ๋์ด์์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
์ฆ, ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด
๋ณ์์ ์ฐธ์กฐ์ nil์ ํ ๋นํด๋, ํด์ ๊ฐ ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
class Dog {
var name: String
var owner: Person
}
class Person {
var name: String
var pet: Dog?
}
var bory: = Dog? = Dog(name: "๋ณด๋ฆฌ")
var gildong: Person? = Person(name: "๊ธธ๋)
// ์๋ก๊ฐ ์๋ก๋ฅผ ๊ฐ๋ฆฌํด: **๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด (Strong Reference Cycle) ๋ฐ์**
bori?.owner = gildong
gildong?.pet = bori
// ์ด๋ ๊ฒ ํ๋ฉด ํด๊ฒฐํ ์ ์์, but ์๊ฐํ๊ธฐ ์ฝ์ง ์์
// bori?.owner = nil
// gildong?.pet = bory
// **๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์**
bori = nil
gildong = nil
ํด๊ฒฐ ๋ฐฉ์
๊ฐ๋ฆฌํค๋ ์ธ์คํด์ค์ RC์ ์ซ์๋ฅผ ์ฌ๋ผ๊ฐ์ง ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
๋ด๊ฐ ๊ฐ๋ฆฌํค๋ ์๋ก์ ๊ฐ์ RC์ ์ ์ฉ์ํค์ง ์๋๋ค.
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ๋ง๋ค์ง ์๊ณ ๋ ์๋ก๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
์ฝํ์ฐธ์กฐ (
Weak Reference
)์์ ์์ ๋นํด ๋ณด๋ค ์งง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๋ ์ฃผ๋ก ์ฌ์ฉ
(๋ค๋ฅธ ์ธ์คํด์ค์ ์๋ช ์ด ์งง์ ๊ฒฝ์ฐ. ์ฆ, ๋ค๋ฅธ ์ธ์คํด์ค๊ฐ ๋จผ์ ํ ๋น ํด์ ๋ ์ ์์ ๋)
๊ฐ์ด ์์ด์ง๋ฉด nil์ ์๋ ํ ๋น
์ธ์คํด์ค๊ฐ ํ ๋น ํด์ ๋๋ฉด, ์๋์ผ๋ก nil๋ก ์ฝํ ์ฐธ์กฐ๋ก ์ค์ ํ๋ค.
์ฐธ๊ณ ) ์ด ๋๋ ์์ฑ๊ฐ์์๊ฐ ํธ์ถ๋์ง ์๋๋ค.
์์๋ก ์ ์ธํ ์ ์๋ค.
๋ฐํ์์ ๊ฐ์ nil๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ๋ฝํด์ผํ๊ธฐ ๋๋ฌธ์ ํญ์ ๋ณ์๋ก ์ ์ธ๋๋ค.
๋ฏธ์์ ์ฐธ์กฐ (
Unowned Reference
)RC๋ฅผ ๊ณ ๋ คํ์ฌ ์ฐธ์กฐ ํด์ ์์๋ฅผ ์ฃผ์ํด์ผํจ.
Swift 5.3 ๋ฒ์ ์ดํ, ์ต์ ๋ ์ ์ธ์ด ๊ฐ๋ฅ
๊ฐ์ด ์์ด์ ธ๋ nil ์๋ํ ๋น ํ์ง ์์
์์ ์๋ณด๋ค ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ ๊ธธ๊ฑฐ๋, ๊ฐ์ ๊ฒฝ์ฐ ์ฌ์ฉ
ํญ์ A ๊ฐ์ฒด๊ฐ ๋ ์งง๊ฒ ์ด ๋ A๋ ๋น์์ ์ฐธ์กฐ ์ฌ์ฉ
์ฐธ์กฐ๊ฐ ํญ์ ํ ๋น ํด์ ๋์ง ์๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ ๊ฒ
์ธ์คํด์ค๊ฐ ํ ๋น ํด์ ๋ ํ์ ๋ฏธ์์ ์ฐธ์กฐ์ ๊ฐ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด, ๋ฐํ์ ์๋ฌ ๋ฐ์
๊ณตํต์
๊ฐ๋ฆฌํค๋ ์ธ์คํด์ค์ RC๋ฅผ ์ฌ๋ผ๊ฐ์ง ์๊ฒ ํจ (์ธ์คํด์ค ์ฌ์ด์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๋ค.)
์ธ์คํด์ค์ ์ ๊ทผ์ ๊ฐ๋ฅํ์ง๋ง, ์ธ์คํด์ค๋ฅผ ์ ์ง์ํค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ฐจ์ด์
weak : ์์ ์์ ๋นํด ๋ณด๋ค ์งง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ์ฉํ๋ค.
unwoned : ์์ ์๋ณด๋ค ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ ๊ธธ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
โ ์ค์ ๋ก๋ weak๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ค. (๋น์์ ์ฐธ์กฐ๋ ํ๋ฒ ๋ ๊ณ ๋ คํด์ผํ๋๊น)
unowned
๊ฐ ์กฐ๊ธ ๋ ๋น ๋ฆ!์ค์ ๋ก๋ unowned๋ ์ฝ๋๋ฅผ ๋ ์์ฑํด์ผํ๊ธฐ๋๋ฌธ์ weak์ ๋ ๋ง์ด ์ฌ์ฉํ๊ธฐ๋ ํจ
์์ ์ฝ๋
์ฝํ์ฐธ์กฐ
class Dog { var name: String **weak** var owner: Person? // weak ํค์๋ -> ์ฝํ ์ฐธ์กฐ } class Person { var name: String **weak** var pet: Dog }
์ฝํ์ฐธ์กฐ๋ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง๋ฉด, ํด๋น ๋ณ์๋ฅผ nil์ ์๋์ผ๋ก ํ ๋นํ๋ค.
๋น์์ ์ฐธ์กฐ (Unowned reference)
class Dog { var name: String **unowned** var owner: Person? // swift 5.3 ์ด์ ์๋ ์ต์ ๋ ํ์ ์ด ๋ถ๊ฐ๋ฅํ์์. } class Person { var name: String **unowned** var pet: Dog? // ํ ์ชฝ๋ง Unowned๋ก ์ ์ธํด๋ ๋จ } gildong = nil **bori.owner = nil** // ์ด๋ ๊ฒ ํ ๋นํด์ค์ผ๋ผ
๋น์์ ์ฐธ์กฐ์ ๊ฒฝ์ฐ, ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง๋ฉด nil๋ก ์ด๊ธฐํ๋์ง ์์.
โ nil๋ก ํ ๋นํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค. (์ ํ๋ฉด ์ฑ์ด ์ข ๋ฃ๋จ)
์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง๋ฉด, nil๋ก ์ด๊ธฐํ๋์ง ์๋๋ค.
// ์๋ฌ ๋ฐ์ํ๋ ์ผ์ด์ค gildong = nil bori.owner // nil๋ก ์ด๊ธฐํ๋์ง ์์์ ์๋ฌ๊ฐ ๋ฐ์ํจ // ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ gildong = nil bori.owner = nil // nil๋ก ์ฌ์ค์ ํ์ bori.owner // ์ ๊ทผ ๊ฐ๋ฅ
๊ฐ์ฒด ๋ด์์ ํด๋ก์ ์ ์ฌ์ฉ
๐ก (์์ฝ) ํด๋ก์ ์ ๋ํ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด
ํด๋์ค ์ธ์คํด์ค ์์ฑ์ ํด๋ก์ ํ ๋น ํ, ํด๋ก์ ์์ ์ธ์คํด์ค ์บก์ฒํ๋ ๊ฒฝ์ฐ ๋ฐ์
โ self๋ฅผ ์บก์ฒํ์ฌ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ์์ฑํ๊ฒ ๋๋ค.
โ ํด๋ก์ ๋ ํด๋์ค์ ๊ฐ์ ์ฐธ์กฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค!!
์ผ๋ฐ์ ์ธ ํด๋ก์ ์ ์ฌ์ฉ
ํด๋ก์ ๋ด์์ ๊ฐ์ฒด์ ์์ฑ ๋ฐ ๋ฉ์๋์ ์ ๊ทผํ ๋
**self**
ํค์๋ ๋ฐ๋์ ์ฌ์ฉํด์ผํ๋ค.๊ฐํ ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๋ค๋ ๊ฒ์ ํ์ํ๊ธฐ ์ํด์์ด๋ค.
๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ, self ์๋ต์ด ๊ฐ๋ฅํ๋ค.
Swift5.3 ์ดํ [self]๋ก ํ ์ ์์
self.name [self]
์ฐ๋ ๋๋ฅผ ์ฌ๋ฌ๊ฐ ์ฐ๋ ๊ฒฝ์ฐ, ์๋ก์ด Stack์ ๋ง๋ค๊ฒ ๋๋ค.
์ฐ๊ด๋ ์ผ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ๋ค์ Stack ๋ด์์๋ง ์กด์ฌ! ๊ฐ ์ฐ๋ ๋ ๋ณ Stack
๊ทธ๋ฐ๋ฐ, code, data, heap์ Stack๋ผ๋ฆฌ ๋ค๊ฐ์ด ๊ณต์ ํ๋ค!
class Dog {
var name = "choco"
func doSomething() { // **ํด๋์ค ๋ด ํด๋ก์ **
// 2๋ฒ CPU์์ ๋์ํ๋ ์ฝ๋๋ผ๊ณ ์๊ฐ, ์ผ์ ๋ถ๋ฆฌ, ๋์ ์ผ ์ฒ๋ฆฌ (๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ํด๋ก์ )
// 2๋ฒ ์ฐ๋ ๋๋ ์ค๋ซ๋์ ์ ์ฅํด์ผํจ (์๋ก์ด ์คํ์ ๋ง๋ค์ด์ ์คํํ๋ฏ๋ก)
DispatchQueue.global().async { // ๊ฐํ์ฐธ์กฐ ์ฌ์ดํด์ด ์ผ์ด๋ ์ ์์.
print("my name is \(**self.name**)")
}
// DispatchQueue.global().async { **[self]** in
// print("my name is \(**name**)")
// }
}
}
var choco = Dog()
choco.doSomething()
//๋ง์ฝ ๊ฐํ์ฐธ์กฐ ์ฌ์ดํด์ด ์ผ์ด๋๋ค๋ฉด
DispatchQueue.global().async { [weak self] in // ๊ฐํ์ฐธ์กฐ ์ฌ์ดํด์ด ์ผ์ด๋ ์ ์์.
print("my name is \(**name**)")
}
ํด๋ก์ ์ ์บก์ฒ๋ฆฌ์คํธ - ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ํด๊ฒฐ (strong reference cycle)
ํด๋ก์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บก์ฒ ํ์์ด ๋ฐ์ํ๋ค.
ํด๋ก์ ์ ์ธ์คํด์ค๊ฐ ๊ฐํ ์ฐธ์กฐ๋ก, ์๋ก ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ = Strong Reference Cycle
๋ฉ๋ชจ๋ฆฌ์์ ์ ์์ ์ผ๋ก ํด์ ๋์ง ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ด ๋ฐ์ํ๋ค.
์บก์ฒ ๋ฆฌ์คํธ ๋ด์์ ์ฝํ ์ฐธ์กฐ, ๋๋ ๋น์์ ์ฐธ์กฐ๋ฅผ ์ ์ธํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ฝ๋ ๊ฐ ๊ด๊ณ์ ๋ฐ๋ผ ์ ํํด์ผํ๋ค. (๋ณดํต weak๊ณผ ์ฌ์ฉํ๋ค)
Last updated