ARC
- ์๋ ์ฐธ์กฐ ์นด์ดํ Automatic Reference Counting
- swift๋ ARC๋ก ์ธ์คํด์ค๊ฐ ํ์ํ์ง ์์ ๋ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ค๋ค.
- ๋น์ฐํ๊ฒ๋ struct์ enum์ ๊ฐ์ ๋ณต์ฌํ๋ valueํ์ ์ด๊ธฐ ๋๋ฌธ์ ํด๋น๋์ง ์๊ณ ์ฐธ์กฐ ํ์ ์ธ class์ ์ธ์คํด์ค์๋ง ์ฐธ์กฐ ์นด์ดํ ์ด ์ ์ฉ๋๋ค.
- ์๋ฐ์์ ์ฌ์ฉํ๋ ๊ฐ๋น์ง ์ฝ๋ ์ (GC)์ ๋ค๋ฅธ์ ์ GC๋ ๋ฐํ์๋ ๊ณ์ ์ฐธ์กฐ๋ฅผ ์ถ์ ํ๊ณ RC๋ ์ปดํ์ผ๋ ๋ชจ๋ ๊ฒฐ์ ์ด ๋๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
ARC์ ์๋ ์๋ฆฌ
- ํด๋์ค์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ARC๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ค
- ์ธ์คํด์ค๊ฐ ๋์ด์ ํ์์น ์์ ๋ ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํด์ค
- ์ฌ์ฉ์ค์ธ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ ํด์ ํ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค์ ๊ฐํ ์ฐธ์กฐ (strong reference) ๋ฅผ ๋ง๋ค์ด ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋ ๋ ํด์ ๋ฅผ ํจ
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด (Strong Reference Cycles)
- ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ํด์ ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ → ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
var tenant: Person?
deinit { print("Apartment \\(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
- Person์ Apartment ์ธ์คํด์ค ์ต์ ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง
- Apartment๋ Person ์ธ์คํด์ค ์ต์ ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง
- john, unit4A ๋ ์ธ์คํด์ค๋ฅผ ์๋ก ์ฐ๊ฒฐ์ํด → ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ์์ฑ
john = nil
unit4A = nil
- ์ธ์คํด์ค ๊ฐ์ ๊ฐํ ์ฐธ์กฐ๋ ๋จ์์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ์๋จ
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ํด๊ฒฐ - ์ฝํ ์ฐธ์กฐ
- ์ฝํ ์ฐธ์กฐ๋?
- ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ํ ๋น ํด์ ๋๋ฉด ์ฝํ ์ฐธ์กฐ๋ฅผ ํ ์ธ์คํด์ค๋ฅผ nil ๋ก ์๋์ผ๋ก ์ค์ ํ๋ค.
- weak ํค์๋
- weak let ๋ ์๋๊ณ weak var ๋ง ๋๋ ์ด์ ?
- ์ธ์คํด์ค๊ฐ ํ ๋น ํด์ ๋ ๋ ์ฝํ ์ฐธ์กฐ๋ฉด ์๋์ผ๋ก nil๋ก ๋ฐ๊ฟ์ค๋ค.
- ์ฆ ๋ฐํ์์ ๊ฐ์ด nil๋ก ๋ฐ๋๋๊ฒ์ ํ๋ฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์๋ ์ธ ์ ์๋ค.
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person? // ์ฝํ ์ฐธ์กฐ
deinit { print("Apartment \\(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
- apartment ์ธ์คํด์ค๋ Person ์ธ์คํด์ค์ ๋ํด ์ฝํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ฐ๋ผ์ ์ฐธ์กฐํ๋ john ์ด ํด์ ๋์๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ tenant ํ๋กํผํฐ๋ nil ๋ก ์ค์ ๋๋ค.
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ํด๊ฒฐ - ๋ฏธ์์ ์ฐธ์กฐ
- unowned ํค์๋
- ์ฝํ์ฐธ์กฐ๋ ๋ค๋ฅด๊ฒ ์ต์ ๋์ด ์๋๊ณ ํญ์ ๊ฐ์ ๊ฐ์ง๊ณ ์์
- ์ฝํ ์ฐธ์กฐ์ ๋ค๋ฅด๊ฒ ๋ฏธ์์ ์ฐธ์กฐ๋ ๋ค๋ฅธ ์ธ์คํด์ค์ ์๋ช ์ด ๊ฐ๊ฑฐ๋ ๋ ๊ธด ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
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 // ๋ฏธ์์ ์ฐธ์กฐ, ์ต์
๋ x
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit { print("Card #\\(number) is being deinitialized") }
}
var john: Customer?
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
john = nil
- ๊ณ ๊ฐ์ ํญ์ ์ ์ฉ์นด๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง ์ ์ฉ์นด๋๋ ํญ์ ๊ณ ๊ฐ์ด ์๋ค.
- ๊ณ ๊ฐ์ด ์ ์ฉ์นด๋๋ณด๋ค ๋ ์ธ์คํด์ค์ ์๋ช ์ด ๊ธธ๋ค๋ ํ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฏธ์์ ์ฐธ์กฐ ์ฌ์ฉ
์ฐธ๊ณ
iOS) ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (1/3) - ARC(Automatic Reference Counting)
'Swift Language Guide' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Language Guide] ํ๋กํ ์ฝ (Protocols) (0) | 2023.08.01 |
---|---|
[Swift Language Guide] ๊ตฌ์กฐ์ฒด์ ํด๋์ค (Structures and Classes) (0) | 2023.06.05 |
[Swift Language Guide] ์ด๊ฑฐํ (Enumerations) (0) | 2023.06.05 |
[Swift Language Guide] ํด๋ก์ (Closures) (0) | 2023.06.05 |
[Swift Language Guide] ํจ์(Functions) (0) | 2023.05.24 |