๐ ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ
๋ฉ๋ชจ๋ฆฌ | ๋์คํฌ |
์ผ๋ฐ์ ์ผ๋ก RAM์ ๋งํจ(๋ช GB) RAM์ ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ๋ก ์๊ตฌ์ ์ผ๋ก ๋ฐ์ดํฐ ์ ์ฅ โ → ์ฑ ์คํ ์ค ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์ฑ์ ์ข ๋ฃ ์ ์ญ์ → ์ฑ ์คํ์ ์ํค๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค. → ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์ฑ์ด ๋ฉ๋ชจ๋ฆฌ์์ ๋ด๋ ค์ฌ ๋ ๊ฐ์ด ๋ด๋ ค์ด → RAM ์ ์ฉ๋์ด ํด ์๋ก, ๋์์ ์คํ์ํฌ ์ ์๋ ์ฑ์ ์ด๋ ๋ง์ ๋์คํฌ๋ณด๋ค ์๋๊ฐ ๋น ๋ฆ (CPU๊ฐ ๋์คํฌ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ์ ๋ ๋นจ๋ฆฌ ์ ๊ทผ) ๋์คํฌ์ ๋นํด ์ฉ๋์ด ์์ (๋ณดํต 8GB, 16GB, 32GB) EEPROM ๊ณผ ๊ฐ์ ๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ๋ ์์ ์์ดํฐ์ ์ด๊ณณ์ ์ฅ์น์ ์ผ๋ จ๋ฒํธ ๋ฐ ํ๋์จ์ด ์ ๋ณด๋ฅผ ์ ์ฅ |
์๊ตฌ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณณ. ๋นํ๋ฐ์ฑ ์ฅ์น → ์ฑ ์คํ ์ค ์ฑ์ ์ข ๋ฃํด๋ ๋์คํฌ์ ์์ ํ์ผ, ๋ฌธ์, ํ๋ก๊ทธ๋จ ๋ฑ ์๋์ ์ผ๋ก ์ฉ๋์ด ํฐ ์ ๋ณด๋ค์ ๋ด์ ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ ๋นํด ์๋๊ฐ ๋๋ฆผ UserDefaults, CoreData๋ฅผ ํ์ฉํด ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
๐ MRC(Manual Reference Counting)์ ARC(Automatic Reference Counting)
ARC(Automatic Reference Counting) | MRC(Manual Reference Counting) |
ARC๋ Swift ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ
. Java ์ GC ๊ฐ ์๋ค๋ฉด Swift ์๋ ARC ๊ฐ ์์. Reference Count ๋ฅผ ์๋์ผ๋ก ๊ณ์ฐ. (Automatic) ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ RC = 1 ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๋ณ์๋ ์์ฑ์ ํ ๋น๋์ด ์ฐธ์กฐ๋ ๋๋ง๋ค RC +1 ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ํด์ ๋ ๋๋ง๋ค RC -1 RC = 0 ์ด๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ |
MRC ๋ Objective-C ์์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ
Reference Count ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ก ์ง์ ๊ณ์ฐ. (Manual) ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๋ณ์๋ ์์ฑ์ ํ ๋น๋์ด ์ฐธ์กฐ๋ ๋๋ง๋ค ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก RC ์ฆ๊ฐ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ํด์ ๋ ๋๋ง๋ค ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก RC ๊ฐ์ RC ๊ฐ 0 ์ด๋๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ํด์ . |
์์
class MyClass {
init(){}
deinit{} // ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ํธ์ถ
}
// myClass์ ๋ํ RC = 1 : : MyClass ์์ฑ. ์ธ์คํด์ค ์์ฑํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์
var myClass: MyClass? = MyClass()
// RC = 2 : myClass2๊ฐ myClass๋ฅผ ์ฐธ์กฐ
var myClass2 = myClass
// RC = 2 -1 = 1
myClass = nil
// RC = 1 -1 = 0 : MyClass ์๋ฉธ
myClass2 = nil
์ธ์คํด์ค๋ฅผ ์ ์ธํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ผ๋ ๊ณต๊ฐ์ MyClass๊ฐ ์ฌ๋ผ๊ฐ ๊ฒ์ด๋ค.
์ธ์คํด์ค๋ ํ๋ ์ด์์ ์ฐธ์กฐ์(์์ ์)๊ฐ ์์ด์ผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๊ฐ ๋๋ค.
์ฐธ์กฐ์๊ฐ ์๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๊ฐ ๋๊ณ , ์ด๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ฐธ์กฐ์์ ๊ฐ์๋ฅผ RC๋ผ ํ๋ค.
RC = 0 ์ด๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ .
๐ ์ฝ์ฐธ์กฐ์ ๊ฐ์ฐธ์กฐ
์ฝ์ฐธ์กฐ - weak ํค์๋
Reference Count ๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ผ๋ฉด์ ์ฐธ์กฐํ๋ ๊ฒ.
๊ฐ์ฐธ์กฐ - ์ผ๋ฐ์ ์ธ ์ฐธ์กฐ ๋ฐฉ์
Reference Count ๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ์ฐธ์กฐํ๋ ๊ฒ.
๐ ํด๋ก์ ์ ์บก์ฒ๋ง / ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
Swift์์ ํด๋ก์ ์์์ ๊ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ์บก์ฒ๋ง์ด ์๋ค.
class Jihyeon {
let mbti = "ENFP"
init() {
print("ํด๋์ค ์์ฑ")
}
deinit {
print("ํด๋์ค ์๋ฉธ")
}
}
// jh rc = 1
var jh: Jihyeon? = Jihyeon()
// ํด๋ก์ ๋ด๋ถ์์ jh ์บก์ฒํ๋ฉด rc +1 ์ฆ๊ฐ. jh rc = 2
let printMbti: () -> () = { [jh] in //์บก์ฒ๋ง -> ํด๋ก์ ์์ ์ธ๋ถ์ ๊ฐ ์บก์ฒํด์ ์ฌ์ฉ ์ RC ์ฆ๊ฐ
guard let jh else { return } //guard let์ผ๋ก ์ต์
๋๋ฐ์ธ๋ฉ
print("jihyeon's mbti = \(jh.mbti)")
}
printMbti()
// jh rc = 2-1 = 1
jh = nil
// ์์ 15๋ฒ ์ฝ๋์์ weak ํค์๋๋ฅผ ์ผ๋ค๋ฉด, jh rc = 1
// let printMbti: () -> () = { [weak jh] in
// jh = nil -> ํด๋์ค ์๋ช
๊ฐํ์ ์ ์บก์ฒ๋ ํด๋ก์ ๋ด๋ถ์์ ์ธ๋ถ์ ๋ณ์๋ฅผ ๊ณ์ ์ฌ์ฉํด์ผํด์ ์บก์ฒ
๊ฐํ์ ์ [์บก์ฒ๋ฆฌ์คํธ]๋ ํด๋ก์ ์ธ๋ถ์ ์กด์ฌํ๋ ๊ฐ์ ๋ณต์ฌํด์ ์ฌ์ฉ. ์ธ๋ถ ์์ธ์ ์ํ ๊ฐ ๋ณ๊ฒฝ ๋ฐฉ์ง
๐ ์ํ ์ฐธ์กฐ(๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด)
๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak) : ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ฌ ๋ฉ๋ชจ๋ฆฌ์ ๋ถ๋ด์ด ๋๋ ์ํฉ
ํด๋์ค A๊ฐ ํด๋์คB๋ฅผ ์ฐธ์กฐํ๋ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ด๋ค.
์ํ์ฐธ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐ์์ํค๋ ๋ํ์ ์ธ ์ฌ๋ก์ด๋ค.
class Person {
var pet: Dog?
init() {
print("Person ํด๋์ค ์์ฑ")
}
deinit {
print("Person ํด๋์ค ์๋ฉธ")
}
}
class Dog {
var owner: Person?
init() {
print("Dog ํด๋์ค ์์ฑ")
}
deinit {
print("Dog ํด๋์ค ์๋ฉธ")
}
}
// person rc = 1
var person: Person? = Person()
// dog rc = 1
var dog: Dog? = Dog()
// dog rc = 2 : dog์ ์์ ์(์ฐธ์กฐ์)๊ฐ ์ฆ๊ฐ
person?.pet = dog
// person rc = 2
dog?.owner = person
// person rc = 1
person = nil
// dog rc = 1
dog = nil