ARC(Automatic Reference Counting) ๋?
- Swift๋ ARC๋ฅผ ์ฌ์ฉํ์ฌ Heap ์์ญ์ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ค.
- ARC๋ Heap ์์ญ์ ๊ฐ์ฒด์ ๋ํ Strong Reference(๊ฐํ ์ฐธ์กฐ) count๋ฅผ ์ถ์ ํ๊ณ ,
- ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ (์ฐธ์กฐ count๊ฐ ์์ ๋) ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
Strong Reference (๊ฐํ ์ฐธ์กฐ)
- Swift์์ ๋ณ์๋ ์์๋ Strong Reference(๊ฐํ ์ฐธ์กฐ)๋ฅผ ํ๋ค.
- ๊ฐ์ฒด์ ๋ํ Strong Reference count๊ฐ ์ฆ๊ฐ๋์ด ์๋ค๋ฉด,
- ํด๋น ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ค.
class Person { // Person์ด๋ผ๋ ์ฐธ์กฐ ํ์
์ ํด๋์ค
var name: String
init(name: String) {
self.name = name
}
}
// person1์ด๋ผ๋ Personํ์
์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ค
var person1: Person? = Person(name: "Alice") // ๊ฐํ ์ฐธ์กฐ
var person2 = person1 // ๋ ๋ค๋ฅธ ๊ฐํ ์ฐธ์กฐ
// person1์ด nil์ด ๋๋๋ผ๋ person2๊ฐ ์ฌ์ ํ strong ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋จ
person1 = nil
Circular References (์ํ ์ฐธ์กฐ)
- ARC ์๋ ๋ฐฉ์์ ํน์ฑ์ ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ค. (๋ฌธ์ ์ )
- ๋ ๊ฐ์ฒด ๋ชจ๋ ๋์ด์ ์ฌ์ฉ๋์ง ์๋๋ผ๋ ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, Strong Reference count๊ฐ ๊ฐ์ํ์ง ์์,
- ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ๋ชปํ๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์ฝํ ์ฐธ์กฐ(weak reference)์ ๋ฏธ์์ ์ฐธ์กฐ(unowned reference) ๊ฐ์ ๋ค๋ฅธ ์ฐธ์กฐ ์ ํ์ ์ฌ์ฉํ ์ ์๋ค.
class Person {
var name: String
// Petํ์
์ pet ํ๋กํผํฐ
var pet: Pet? // Person์ด ์์ ํ๋ Pet
init(name: String) {
self.name = name
}
}
class Pet {
var species: String
// Personํ์
์ owner ํ๋กํผํฐ
var owner: Person? // Pet์ ์์ ํ๋ Person
init(species: String) {
self.species = species
}
}
// ๋ ์ฐธ์กฐ ํ์์ด ์๋ก ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
// ์ด๋ ๊ฒ ๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ์ํ์ฐธ์กฐ ๋ฐ์
// ๋ ์ธ์คํด์ค๊ฐ ํด์ ๋๋๋ผ๋ ์ํ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋จ
// ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํฌ ์ ์์.
var person: Person? = Person(name: "Alice") // Person ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ
var pet: Pet? = Pet(species: "Dog") // Pet ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ
person?.pet = pet // Person ํด๋์ค์ pet์ Pet ์ธ์คํด์ค๋ฅผ ํ ๋น
pet?.owner = person // Pet ํด๋์ค์ owner์ Person ์ธ์คํด์ค๋ฅผ ํ ๋น
Weak Reference (์ฝํ ์ฐธ์กฐ)
- ์ฝํ ์ฐธ์กฐ๋ Strong Reference(๊ฐํ ์ฐธ์กฐ)์๋ ๋ฌ๋ฆฌ ๊ฐ์ฒด์ ์ฐธ์กฐ count ์ฆ๊ฐ์ํค์ง ์๋๋ค.
- ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ์ฐธ์กฐ๋ฅผ ์ ์งํ ์ ์๋ค.
class Person {
var name: String
// Personํ์
์ ๊ฐ์ง๋ friendํ๋กํผํฐ ์กด์ฌ
// weak ํค์๋๋ฅผ ๋ณ์์ ์ธ ์์ ๋ถ์ฌ ํด๋น Personํ์
์ ํ๋กํผํฐ๋ฅผ ์ฝํ์ฐธ์กฐ๋ก ์ ์ธ
weak var friend: Person? // ์ฝํ ์ฐธ์กฐ
init(name: String) {
self.name = name
}
}
// person1, 2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ
var person1: Person? = Person(name: "Alice")
var person2: Person? = Person(name: "Bob")
// friend ํ๋กํผํฐ๋ฅผ ์๋ก์ ์ธ์คํด์ค์ ์ฐ๊ฒฐ
person1?.friend = person2
person2?.friend = person1
// person1์ด nil๋ก ํ ๋น๋์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋จ, ๊ทธ์ ๋ฐ๋ผ person1๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๊ฐ์๋จ
person1 = nil
Unowned Reference (๋ฏธ์์ ์ฐธ์กฐ)
- ๋ฏธ์์ ์ฐธ์กฐ๋ ์ฝํ ์ฐธ์กฐ์ ์ ์ฌํ์ง๋ง, optional ๊ฐ์ด ์๋๋ผ์ nil๋ก ์ค์ ๋ ์ ์๋ค.
- ๋ง์ผ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ์ํ์์ ์ ๊ทผํ๋ ค ํ๋ฉด runtime error๊ฐ ๋ฐ์๋๋ฉฐ,
- ์ฌ์ฉ ์์ ์ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ํด์ ๋์ง ์์๋ค๊ณ ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํด์ผ ํ๋ค.
class Country {
var name: String
var capital: City!
init(name: String, capitalName: String) {
self.name = name
self.capital = City(name: capitalName, country: self)
}
}
class City {
var name: String
// City ๊ฐ์ฒด ์ฌ์ฉ์์ ์์ Country๊ฐ ํด์ ๋์ง ์๋๋ค๊ณ ํ์ ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ
unowned var country: Country // ๋ฏธ์์ ์ฐธ์กฐ(unowned ํค์๋)
init(name: String, country: Country) {
self.name = name
self.country = country
}
}
'๐ Today I Learned > Swift ๋ฌธ๋ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๋คํธ์ํฌ ํต์ (2. REST API) (2) | 2024.01.04 |
---|---|
[Swift] ๋คํธ์ํฌ ํต์ (1. URL ๊ตฌ์ฑ์์) (1) | 2024.01.04 |
[Swift] ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (1) | 2024.01.03 |
[Swift] Alert ์๋ฆผ์ฐฝ ๋์ฐ๊ธฐ (0) | 2023.12.27 |
[Swift] RxSwift (0) | 2023.12.15 |