<TIL>
์ค๋์ iOS ์ฑ ๊ฐ๋ฐ ์ฌํ ์ฃผ๊ฐ ์์ํ๋ ๋ ์ด์๋ค.
(ํ๋ ์๋ก ๋ฐ๋์๋๋ฐ, ๋ค๋ค ๋ ํ๋ฌํ์
์ ์ข๋ค..โบ๏ธ)
๊ฐ์๋ ๋ค ๋ค์๋๋ฐ,
์์ง ์ ์ฒด์ ์ผ๋ก ์ดํด๋ฅผ ๋ชป ํ ๊ฒ ๊ฐ์์ ๋ด์ผ ํ ๋ฒ ๋ ๋ฃ๊ณ ์ ๋ฆฌํ ์์ ์ด๋ค.
์ค๋์ ์ง๋ Escaping Closure ๊ฒ์๊ธ์ ์ด์ด์
ARC์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํ๋ค.
ARC
ARC๋ Automatic Reference Counting์ ์ฝ์๋ก
Swift๋ ์ด ARC๋ฅผ ์ฌ์ฉํ์ฌ Heap ์์ญ์ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
Swift๋ ์ปดํ์ผ ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ ์ฝ๋๋ฅผ ์ ์ ํ ๋ฃ์ด์ค์ผ๋ก์จ
๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ์ง ์๋๋ก ๋์์ค๋๋ค.โบ๏ธ
RC(Reference Counting)์ ๋ง ๊ทธ๋๋ก!!
์ฐธ์กฐ(reference)๋ฅผ ์ธ์ ํด๋น ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋ ๋ ์ฐธ์กฐ๊ฐ์ ๋๋ฆฌ๊ณ ,
๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ฐธ์กฐ๊ฐ์ ์ค์ด๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ
์ฐธ์กฐ๊ฐ์ด 0์ด ๋ ๋ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํฉ๋๋ค.
- ํ(Heap)๋ฉ๋ชจ๋ฆฌ์์ ํด์
- ๋ชจ๋ ์ธ์คํด์ค๋ ์์ ์ RC(Reference Count) ๊ฐ์ ๊ฐ์ง๊ณ ์์
์ด ์ฐธ์กฐ(reference) ๋ฐฉ๋ฒ์ผ๋ก 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
1. Strong Reference(๊ฐํ ์ฐธ์กฐ)
2. Circular Reference(์ํ ์ฐธ์กฐ)
3. Weak Reference(์ฝํ ์ฐธ์กฐ)
4. Unowned Reference(๋ฏธ์์ ์ฐธ์กฐ)
์ด 4๊ฐ์ง๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์
๊ฐ๋จํ๊ฒ 'Swift ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ'์ ๋ํด์ ๋จผ์ ์์๋ด
์๋ค!
Swift ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด,
์ด์์ฒด์ (OS)๋ ๋ฉ๋ชจ๋ฆฌ(RAM)์ ์ด ํ๋ก๊ทธ๋จ์ ์ํ ๊ณต๊ฐ์ ํ ๋นํด์ค๋๋ค.
๊ทธ ๊ณต๊ฐ์ ์๋์ ๊ฐ์ต๋๋ค.
์ด๋ ๊ฒ ์ฝ๋ ์์ญ(Code), ๋ฐ์ดํฐ ์์ญ(Data), ํ ์์ญ(Heap), ์คํ ์์ญ(Stack)์ผ๋ก
4๊ฐ์ง ์์ญ์ผ๋ก ๋๋์ด์ ธ ์์ต๋๋ค.
1. Code ์์ญ
- ํ๋ก๊ทธ๋จ์ ์คํ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์
๋๋ค.
- ์ปดํ์ผ๋ ์์ค ์ฝ๋์ ํ๋ก๊ทธ๋จ์ ๋ช
๋ น์ด๋ค์ด ์ ์ฅ๋์ด ์์ต๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ ๊ธฐ๊ณ์ด ํํ๋ก ์ ์ฅ๋ฉ๋๋ค. (ex.0010101)
- ์ปดํ์ผ ํ์์ ๊ฒฐ์ ๋๊ณ , ์ค๊ฐ์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก Read-Only ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.
2. Data ์์ญ
- ์ ์ญ ๋ณ์(global vaiables)์ ์ ์ ๋ณ์(static variables), ์์(constants)๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์
๋๋ค.
- ํ๋ก๊ทธ๋จ ์์ ์ ํ ๋น๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋ ๋๊น์ง ์ ์ง๋ฉ๋๋ค. (ex. static)
(= ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ ๋์ด์ผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋จ)
- ์คํ ๋์ค ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ผ๋ Read-Write์ผ๋ก ์ง์ ๋ฉ๋๋ค.
3. Heap ์์ญ
- ํ๋ก๊ทธ๋จ ์คํ ์ค(๋ฐํ์) ๋์ ์ผ๋ก ํ ๋น๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณณ์
๋๋ค.
- ๋ฐํ์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ดํ ์ ์์ต๋๋ค.
- ํ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์ง์ ์ ์ผ๋ก ํฌ์ธํฐ๋ฅผ ํตํด ์ ๊ทผ(์ฐธ์กฐ)๋ฉ๋๋ค.
- ํ์ ์คํ๊ณผ๋ ๋ฌ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๊ณต๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก,
ํฌ๊ธฐ๋ ์๋ช
์ ๋ํ ๋์ ์ธ ์๊ตฌ์ ๋์ํ ์ ์์ต๋๋ค.
- ์ฐธ์กฐํ์
(Reference Type)์ด ์ ์ฅ๋๋ ์์ญ์
๋๋ค.
- ์ฌ์ฉํ๊ณ ๋ ํ์๋ ๋ฐ๋์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํด์ฃผ์ด์ผํฉ๋๋ค.
(๊ทธ๋ ์ง ์์ผ๋ฉด memory leak์ด ๋ฐ์)
- Code, Data, Stack ์ค ์ ์ผํ๊ฒ ๋ฐํ์ ์์ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์
๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ํ์คํ์ง ์์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์ธ์คํด์ค๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
์ฅ์ | - ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์ ํ์ด ์์ - ๋ฒ์๊ฐ ์ ์ญ์ด๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ํจ์์์ ์ก์ธ์ค ํ ์ ์์ |
๋จ์ | - ํ ๋น ์์
, ํด์ ์์
์ผ๋ก ์ธํ ์๋ ์ ํ - ํ ์์(์ด์ค ํด์ , ํด์ ํ ์ฌ์ฉ ๋ฑ)์ผ๋ก ์ธํ ์๋ ์ ํ - ํ ๊ฒฝํฉ(2๊ฐ ์ด์์ thread๊ฐ ๋์์ ์ ๊ทผํ๋ ค ํ ๋ lock์ด ๊ฑธ๋ฆผ)์ผ๋ก ์ธํ ์๋ ์ ํ - ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํด์ผ ํจ(์๊ทธ๋ฌ๋ฉด memory leak ๋ฐ์) |
4. Stack ์์ญ
- ์์ค์ฝ๋๊ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๊ธฐ๊ณ์ด๋ก ๋ณํ๋๋ ์์ (์ปดํ์ผ ํ์)์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
- ํจ์ ํธ์ถ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ํด๋น ํจ์์ ๋ก์ปฌ ๋ณ์(local variables), ํจ์ ๋งค๊ฐ๋ณ์(parameter), ๋ฐํ ์ฃผ์(return address)
๊ทธ๋ฆฌ๊ณ ํจ์ ํธ์ถ์ ํ์ํ ๊ธฐํ ์ ๋ณด๊ฐ ์คํ์ ์ ์ฅ๋ฉ๋๋ค.
- ํจ์๊ฐ ์คํ์ ๋ง์น๋ฉด ํด๋น ํจ์์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
- ์ปดํ์ผ ํ์์ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฌดํํ ํ ๋นํ ์ ์์ต๋๋ค.
- ์คํ์ ํ์
์ ์ถ(LIFO)์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๊ฐํ์
(Value Type)์ด ์ ์ฅ๋๋ ์์ญ์
๋๋ค.
- ์ธ์คํด์ค๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
์ฅ์ | - CPU๊ฐ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฆ - ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํด์ ํด์ฃผ์ง ์์๋ ๋จ |
๋จ์ | - ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๋ํ ์ ํ์ด ์์ - ์ง์ญ ๋ณ์๋ง ์ก์ธ์ค๊ฐ ๊ฐ๋ฅํจ |
๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฅด๊ฑฐ๋, ์คํ์ ์ ์ฅํ๊ธฐ์๋ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด?
ํ(Heap)์ ํ ๋นํ๋ฉด ๋๊ณ ,
๊ทธ ์ธ์๋ ์คํ(Stack)์ ํ ๋นํ๋ฉด ๋ฉ๋๋ค.
์คํ(Stack)์ ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฒ ๋๋ฉด,
์คํ ์ค๋ฒ ํ๋ก์ฐ(Stack Overflow)๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
Stack Overflow?๐ง
ํจ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋, CPU๋ ๋ฐํ ์ฃผ์(return address)๋ฅผ ์คํ(Stack)์ ๋ฐฐ์นํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ถ์ด ์ข
๋ฃ๋๋ฉด, CPU๋ ๋ฐํ ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ํธ์ถ์์๊ฒ ์๋ตํฉ๋๋ค.
๊ทธ๋์ ๋์ด ์๋ ์ฌ๊ท ํจ์(recursive function)์ ์ฌ์ฉํ๋ฉด
CPU ์คํ์ ๊ณต๊ฐ์ด ๋ถ์กฑํด์ง๊ฒ ๋๋ฉด์ ๋ฐ์ํ๋ ๊ฒ์ด ๋ฐ๋ก 'Stack Overflow' ์
๋๋ค.
๐ฅ๊ทธ๋ผ ์ด์ !๐ฅ
์ด 4๊ฐ์ง์ ๋ํด์ ์์๋ด
์๋ค!! :)
1. Strong Reference(๊ฐํ ์ฐธ์กฐ)
๊ธฐ๋ณธ์ ์ผ๋ก Swift์์๋ ๋ณ์๋ ์์๋ Strong Reference(๊ฐํ ์ฐธ์กฐ)๋ฅผ ํฉ๋๋ค.
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var person1: Person? = Person(name: "Yejin") // ๊ฐํ ์ฐธ์กฐ
var person2 = person1 // ๊ฐํ ์ฐธ์กฐ
person1 = nil
์ ์์์ฒ๋ผ person1 = nil ์ ํ๋๋ผ๋
๊ฐํ ์ฐธ์กฐ์ count๊ฐ ์ฆ๊ฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋ฉ๋๋ค.
2. Circular References(์ํ ์ฐธ์กฐ)
์ํ ์ฐธ์กฐ๋ ARC ์๋ ๋ฐฉ์์ ํน์ฑ์
๋ ๊ฐ์ง ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก์ ๋ํ Strong Reference(๊ฐํ ์ฐธ์กฐ) ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ๋ฐ์ํฉ๋๋ค.
์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ์๋ก์ ๋ํ ์ฐธ์กฐ๊ฐ ํด์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ์ง๋์ด
Reference count๊ฐ ๊ฐ์ํ์ง ์์ต๋๋ค.
์ด๋ก ์ธํ memory leak(๋ฉ๋ชจ๋ฆฌ ๋ฆญ)์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
class Person {
var name: String
var pet: Pet? // Person์ด ์์ ํ๋ Pet
init(name: String) {
self.name = name
}
}
class Pet {
var species: String
var owner: Person? // Pet์ ์์ ํ๋ Person
init(species: String) {
self.species = species
}
}
var person: Person? = Person(name: "Yejin") // Person ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ
var pet: Pet? = Pet(species: "Cheeze") // Pet ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ
person?.pet = pet // Person ํด๋์ค์ pet์ Pet ์ธ์คํด์ค๋ฅผ ํ ๋น
pet?.owner = person // Pet ํด๋์ค์ owner์ Person ์ธ์คํด์ค๋ฅผ ํ ๋น
๊ทธ๋ ๋ค๋ฉด,
๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋ก์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋ก์ ๋ํ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์
๊ฐ ์ธ์คํด์ค๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๊ณ์ ์ ์งํ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ 'Strong Retain Cycle(๊ฐํ ์ํ ์ฐธ์กฐ)'๋ผ๊ณ ํฉ๋๋ค.
class Person {
let name: String
init(name: String) {
self.name = name
}
var car: Car?
deinit {
print("deinit Person class instance")
}
}
class Car {
let model: String
init(model: String) {
self.model = model
}
var owner: Person?
deinit {
print("deinit Car class instance")
}
}
Person ํด๋์ค๋
String ํ์
์ name ํ๋กํผํฐ์
nil๋ก ์ด๊ธฐํ๋ ์ต์
๋ Car? ํ์
์ car ํ๋กํผํฐ๊ฐ ์์ต๋๋ค.
Car ํด๋์ค์๋
String ํ์
์ model ํ๋กํผํฐ์
nil๋ก ์ด๊ธฐํ๋ ์ต์
๋ Person? ํ์
์ owner ํ๋กํผํฐ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ ํ์
์ ๋ณ์๋ฅผ ์ ์ํ๊ณ , ์ธ์คํฐ์ค๋ฅผ ํ ๋นํด๋ด
์๋ค.
๊ทธ๋ฆฌ๊ณ person์ car๋ฅผ
car์ owner๋ฅผ ํ ๋นํด๋ด
์๋ค.
var yejin: Person?
var benz: Car?
yejin = Person(name: "yejin")
benz = Car(model: "benz")
yejin!.car = benz
benz!.owner = yejin
์ด๋ ๊ฒ ํ๋ฉด
์ด ๋ ์ธ์คํด์ค(yejin, benz)๋ ์๋ก ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
reference count๋ฅผ ํ์ธํด๋ณด๋ฉด,
yejin์
Person ์ธ์คํด์ค๋ฅผ ๊ฐํ ์ฐธ์กฐ count + 1
Person ์ธ์คํด์ค๊ฐ Car ์ธ์คํด์ค์ ๋ํด ๊ฐํ ์ฐธ์กฐ count + 1
(yejin - reference count: 2)
benz๋
Car ์ธ์คํด์ค๋ฅผ ๊ฐํ ์ฐธ์กฐ count + 1
Car ์ธ์คํด์ค๊ฐ Person ์ธ์คํด์ค์ ๋ํด ๊ฐํ ์ฐธ์กฐ count + 1
(benz - reference count: 2)
์ด์ ๋ ๋ณ์์ nil์ ํ ๋นํด ๋ณผ๊น์?
yejin = nil
benz = nil
yejin๊ณผ benz์ nil์ ํ ๋นํ์ฌ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ ค๊ณ ํ์ง๋ง,
๊ฐ๊ฐ์ ์ธ์คํด์ค๊ฐ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
ARC๋ ์ด๋ฐ ๊ฐํญ ์ํ ์ฐธ์กฐ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ ๊ด๋ฆฌํด์ฃผ์ง ์์ผ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์
์ฝํ ์ฐธ์กฐ(weak reference), ๋ฏธ์์ ์ฐธ์กฐ(unowned reference)์ ๊ฐ์ ๋ค๋ฅธ ์ฐธ์กฐ ์ ํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. Weak Reference(์ฝํ ์ฐธ์กฐ)
์ฝํ ์ฐธ์กฐ๋ ๊ฐํ ์ฐธ์กฐ์๋ ๋ค๋ฅด๊ฒ ๊ฐ์ฒด์ ์ฐธ์กฐ count๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ต๋๋ค.
๊ทธ๋์ ๊ฐ์ฒด์ ์๋ช
์ฃผ๊ธฐ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ์ฐธ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
๋ณ์ ํน์ ์์ฑ ์์ weak ํค์๋๋ฅผ ์จ์ Weak Reference์์ ๋ํ๋ผ ์ ์์ต๋๋ค.
์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐํ๊ฒ ์ ์งํ์ง ์๊ธฐ ๋๋ฌธ์
์ฐธ์กฐ๋๊ณ ์๋ ๋์์๋ ํด๋น ์ธ์คํด์ค๊ฐ ํ ๋น ํด์ ๋ ์ ์์ต๋๋ค.
ARC๋ ์ธ์คํด์ค๊ฐ ํ ๋น ํด์ ๋ ๋,
ํด๋น ์ธ์คํด์ค๋ฅผ ์ฝํ ์ฐธ์กฐํ๋ ํ๋กํผํฐ๋ฅผ nil๋ก ์ด๊ธฐํ ํฉ๋๋ค.
๊ทธ๋์ ์ฝํ ์ฐธ์กฐ๋ ํญ์ ์ต์
๋ ๋ณ์์๋ง ๊ฐ๋ฅํ๋ฉฐ, ์์์๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
class Car {
let model: String
init(model: String) {
self.model = model
}
weak var owner: Person?
deinit {
print("deinit Car class instance")
}
}
์๊น์ ์ฝ๋์์ Car ํด๋์ค์ owner ํ๋กํผํฐ์ weak๋ฅผ ๋ถ์ฌ
์ฝํ ์ฐธ์กฐ๋ก ๋ฐ๊ฟ๋ณด์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด,
var yejin: Person?
var benz: Car?
yejin = Person(name: "yejin")
benz = Car(model: "benz")
yejin!.car = benz
benz!.owner = yejin
Person ์ธ์คํด์ค๋ Car ์ธ์คํด์ค์ ๋ํด ์ฌ์ ํ ๊ฐํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๊ฒ ๋๊ณ ,
Car ์ธ์คํด์ค๋ Person ์ธ์คํด์ค์ ๋ํด ์ฝํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์ฆ, ์๊น์ฒ๋ผ (yejin = nil)
์ด๋ ๊ฒ yejin์ด๋ผ๋ ๋ณ์๋ฅผ nil๋ก ๋ง๋ค์ด์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊นจ๊ฒ ๋๋ฉด,
Person ์ธ์คํด์ค๋ ๋์ด์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง์ง ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ Person ์ธ์คํด์ค์ ๋ํด ์ฝํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋
owner ํ๋กํผํฐ๋ nil์ด ๋ฉ๋๋ค.
์๊น๋ print๋์ง ์๋๊ฒ ํ๋ฆฐํธ๊ฐ ๋์ต๋๋ค.๐ฒ
Car ์ธ์คํด์ค์ ๋ํ ๊ฐํ ์ฐธ์กฐ ๋ํ ๊นจ๊ฒ ๋๋ฉด ๋ง์ฐฌ๊ฐ์ง๊ฒ ์ฃ ?
4. Unowned References(๋ฌด์์ ์ฐธ์กฐ)
๋ฌด์์ ์ฐธ์กฐ๋ ๋ค๋ฅธ ์ธ์คํด์ค์ ์๋ช
์ฃผ๊ธฐ๊ฐ ๊ฐ๊ฑฐ๋ ๋ ๊ธด ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
๋ฏธ์์ ์ฐธ์กฐ๋ ์ฝํ ์ฐธ์กฐ์ ์ ์ฌํ์ง๋ง, optional ๊ฐ์ด ์๋๋ผ์ nil๋ก ์ค์ ๋ ์ ์์ต๋๋ค.
๋ง์ฝ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ์ํ๋ก ์ ๊ทผํ๋ ค๊ณ ํ๋ค๋ฉด!
๋ฐํ์ ์๋ฌ(runtime error)๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ฌ์ฉ ์์ ์ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ํด์ ๋์ง ์์๋ค๊ณ ํ์คํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
(ํญ์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ )
๋ณ์ ํน์ ์์ฑ ์์ unowned ํค์๋๋ฅผ ๋ฌ์ ๋ฌด์์ ์ฐธ์กฐ์์ ๋ํ๋
๋๋ค.
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit { print("deinit Customer Class instance") }
}
class CreditCard {
let number: Int
unowned let customer: Customer
init(number: Int, customer: Customer) {
self.number = number
self.customer = customer
}
deinit { print("deinit CreditCard Class instance") }
}
var fubao: Customer?
fubao = Customer(name: "fubao")
fubao!.card = CreditCard(number: 1234, customer: fubao!)
์ ์์๋ฅผ ์ดํด๋ณด๋ฉด,
fubao๋ Customer ์ธ์คํด์ค์ ๋ํด ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ,
CreditCard ์ธ์คํด์ค์ customer์ ๋ํด ๋ฌด์์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง Customer ์ธ์คํด์ค๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์ fubao = nil์ ํ๊ฒ ๋๋ฉด,
deinitialize ๋๋ค๊ณ ์ถ๋ ฅ๋ฉ๋๋ค.
์ฆ, Customer์ ๋ํ ๊ฐํ ์ฐธ์กฐ๊ฐ ํด์ ๋๋ฉด์
Customer ์ธ์คํด์ค์ ๋ํ ๊ฐํ ์ฐธ์กฐ๊ฐ ๋์ด์ ์์ผ๋ฏ๋ก ํ ๋น ํด์ ๋์๊ณ ,
CreditCard ์ธ์คํด์ค์ ๋ํ ๊ฐํ ์ฐธ์กฐ ๋ํ ์์ด์ง๋ฏ๋ก
๋ง์ฐฌ๊ฐ์ง๋ก ํ ๋น ํด์ ๋ ๊ฒ์
๋๋ค.
ARC์ ๊ด๋ จํด์ ๋ ์์ธํ ๋ด์ฉ์
์๋ Swift Documentation์ผ๋ก Go!!
์์ ์ด ํ์ํ ๋ถ๋ถ์ด ์๊ฑฐ๋ ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด, ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!!๐๐ปโ๏ธ
์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.๐
'Study > ํผ๊ณต' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Escaping Closure (2) | 2024.04.28 |
---|---|
[Swift] ๊ณ ์ฐจํจ์(map, filter, reduce) (6) | 2024.04.21 |
[Swift] Show Library ํ์ฉ (Navigation Bar, Label, Button, Text Field) (0) | 2024.04.07 |