๋ฐ์ํ
ARC (Automatic Reference Counting)
- ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ ๋ฐฉ์
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ๊ฒฝ์ ์ธ ํ์๊ฐ ์์
- ARC๋ ๋ ์ด์ ํ์ํ์ง ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค, ํ ์์ญ๊ณผ ๊ด๋ จ
- ํ ์์ญ์ ์ฐธ์กฐ(Reference) ํ ํ์ ์ธ ํด๋์ค, ํด๋ก์ ๋ฑ์ด ๋ณด๊ด
- ๊ฐ(Value) ํ์ ์ธ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ์ ๋ฉ๋ชจ ๋ฆฌ ๊ด๋ฆฌ ๋์์ด ์๋
- ํ ์์ญ์ ์ฐธ์กฐํ ์๋ฃ๋ค์ด ํ๋ก๊ทธ๋จ ์์์ ์ผ๋ง๋ ์ฐธ์กฐ๋๋์ง ์ซ์๋ฅผ ์ธ์ด์, ๋ฉ๋ชจ๋ฆฌ ๊ฐ ์๋์ผ๋ก ํ ๋น ๋ฐ ์ ๊ฑฐํ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ
ARC ๋์
- ARC๋ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ์์ ๋, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น
- ํด๋์ค ์ธ์คํด์ค๊ฐ ๋์ด ์ ํ์ํ์ง ์์ ๋, ARC๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
- ARC๋ ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๋ง๊ธฐ ์ํด ์ผ๋ง๋ ๋ง์ ํ๋กํผํฐ๋ค์ด ๊ฐ๊ฐ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง ์ซ์๋ฅผ ์นด์ดํธ
- Swift์์๋ ๊ฐ ๊ฐ์ฒด๋ง๋ค ์ฐธ์กฐ ํ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด ๊ฐ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์
- ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋๋ ์๊ฐ๊น์ง ARC๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ์ง ์์
๊ฐํ ์ฐธ์กฐ ์ํ (Strong Reference Cycle)
- ๋ ๊ฐ์ ์ฐธ์กฐํ ํ์ ์ ๋ฐ์ดํฐ๊ฐ ์๋ก ๊ฐํ ์ธ์คํด์ค๋ก ์ฐธ์กฐํ๊ณ ์์ด์, ์ฐธ์กฐ ๊ฐ์๊ฐ 0๊ฐ๊ฐ ๋์ง ์๋ ์ํฉ์ ์๋ฏธ
- ์ด๋ค ์ธ์คํด์ค๋ ์์ ์ ์ ์ธํ ๋ณ์๊ฐ nil ์ด ๋์ด๋, ์๋ก์ ๋ํ ๊ฐํ ์ฐธ์กฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น ์ ธ๋๊ฐ์ง ๋ชปํ๊ฒ ๋๊ณ , ์ด๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Cycle) ๋ฐ์
- ๊ฐํ ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์
- ํ๋๋ weak ์ฐธ์กฐ, ๋ค๋ฅธ ํ๋๋ unowned ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
- weak ์ฐธ์กฐ, unowned ์ฐธ์กฐ ๋ชจ๋ ARC์์ ์ฐธ์กฐ ํ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๊ณ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฐํ ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ๊ฐ๋ฅ
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
}
deinit {
print("\(name) is being deinitialized")
}
}
class Apartment {
let unit: String
var tenant: Person?
init(unit: String) {
self.unit = unit
}
deinit {
print("Apartment \(unit) is being deinitialized")
}
}
์ฝํ ์ฐธ์กฐ (Weak References)
- ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ์ฌ์ฉ
- ๊ฐํ ์ฐธ์กฐ์ ๋ค๋ฅด๊ฒ ์ฐธ์กฐ ํ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์์
- ๋ณ์์ ์ ์ธ ์์ weak ํค์๋๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ฉฐ, nil ์ด ํ ๋น๋ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ํญ์ ์ต์ ๋ ํ์
- ARC์์ ์ฝํ ์ฐธ์กฐ์ nil์ ํ ๋นํ๋ฉด ํ๋กํผํฐ ์ต์ ๋ฒ๋ ์คํ๋์ง ์์
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
}
deinit {
print("\(name) is being deinitialized")
}
}
class Apartment {
let unit: String
weak var tenant: Person?
init(unit: String) {
self.unit = unit
}
deinit {
print("Apartment \(unit) is being deinitialized")
}
}
๋ฏธ์์ ์ฐธ์กฐ (Unowned References)
- ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ๊ฐ์ ์์ ํน์ ๋ ๋ค์ ํด์ ๋ ๋ ์ฌ์ฉ
- ํด๋น ์ธ์คํด์ค์ ๋ํ์ฌ Reference Counting์ ํ์ง ๋ง๋ผ๊ณ ์ ์ธํ๋ ๊ฒ
- ๋ณ์์ ์ ์ธ ์์ unowned ํค์๋๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ฉฐ, ์ต์ ๋ ํ์ ์ผ ์๋ ์๊ณ , ์๋ ์๋ ์์ง๋ง nil ์ผ ๊ฒฝ์ฐ์ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ด ํผ
- ์ฐธ์กฐํ๋ ๋์ ํด๋น ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ผ๋ฆฌ๋ผ๋ ํ์ ์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit {
print("\(name) is being deinitialized")
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit {
print("Card #\(number) is being deinitialized")
}
}
ํด๋ก์ ์์์ ๊ฐํ ์ฐธ์กฐ ์ํ
- ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฐธ์กฐ ํ์ ์ธ ํด๋ก์ ์์๋ ๊ฐํ ์ฐธ์กฐ ์ํ์ด ๋ฐ์ ๊ฐ๋ฅ
- ํด๋ก์ ๋ด๋ถ์์ self๋ฅผ ์บก์ฒ(capture)ํด์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, self๋ฅผ ์ฝํ ์ฐธ์กฐ ํน์ ๋ฏธ์์ ์ฐธ์กฐ๋ก ์ง์ ํ๋ฉด ๊ฐํ ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ๊ฐ๋ฅ
- capture: ์์ ์ด ์ ์๋๋ ์์ ์ ์ฃผ๋ณ ํ๊ฒฝ์ผ๋ก๋ถํฐ ์ฌ๋ฌ ์์๋ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ก์๋ด์ด ์ ์ฅ
lazy var someClosure: () -> String = { [weak self] in
// ..
}
๋ฐ์ํ
'โจ๏ธ Language > swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค LV.1] ๋ฌธ์์ด์ ์ ์๋ก ๋ฐ๊พธ๊ธฐ (0) | 2023.02.08 |
---|---|
[Swift] ์ ๊ทผ ์ ์ด (Access Control) (0) | 2023.02.07 |
[Swift] ์ ๋ค๋ฆญ (Generic) (0) | 2023.02.07 |
[Swift] ์๋ฌ ์ฒ๋ฆฌ (0) | 2023.02.07 |
[ํ๋ก๊ทธ๋๋จธ์ค LV.1] ์๋ฐ์๋ฐ์๋ฐ์๋ฐ์๋ฐ์? (0) | 2023.02.07 |