์ค๋ ๊ธฐ๋ค๋ ธ๋ค. ARC๊ฐ ๋ฌด์์ผ๊น? ์๋ฐ์ Garbage Collector์๋ ๋ฌด์์ด ๋ค๋ฅผ๊น? ์ฅ๋จ์ ์ ๋ฌด์์ผ๊น? ์ด๋ค ์๋ฆฌ๋ก ๋์ํ๋ ๊ฒ์ผ๊น? ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ๋ฌด์์ผ๊น? ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น? ์ด๋ฌํ ๋ด ๊ถ๊ธ์ฆ๋ค์ ๋ด์๋ค.
๊ฐ์
-
Reference Type์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ/์ถ์ ์ Reference Count๋ผ๋ ์ฐธ์กฐ ์นด์ดํธ๋ก ํจ
-
Swift๋ ๋๋ถ๋ถ ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌํด์ค
-
ํ์ง๋ง ํน์ ๊ด๊ณ์์ compiler์๊ฒ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํจ
-
ARC๋ Class instance์ ๋ํด์๋ง ์ ์ฉ๋จ (reference type)
๋์ ๋ฐฉ์
- Instance๋ฅผ ๋ง๋ค ๋๋ง๋ค, ARC๋ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ(๋ฉ์ด๋ฆฌ?)๋ฅผ ํ ๋นํ๋ค. ์ด๊ฑด ๊ทธ ์ธ์คํด์ค์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
- ์ด ๋ฉ๋ชจ๋ฆฌ๋ ์ธ์คํด์ค์ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ํ ๊ทธ ์ธ์คํด์ค์ ๊ด๋ จ๋ property๋ ํจ๊ป ์ ์ฅํ๋ค. ๊ทธ๋ฅ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฉด ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๋ค๋ ์ด์ผ๊ธฐ
- ์ถ๊ฐ์ ์ผ๋ก ์ธ์คํด์ค๊ฐ ํ์์๊ฒ๋๋ ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ํค์ ํ๋ค.
- ๊ฒฐ๊ตญ ARC๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ ์
- ๊ทผ๋ฐ ์ด์ ๋ฌธ์ ๊ฐ ๋ญ๋๋ฉด, ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ์ธ์คํด์ค์ ๋ํด ํ ๋น ํด์ ํ๋ ๊ฒฝ์ฐ์ด๋ค.
- ์ด๋ด ๊ฒฝ์ฐ, ์ด๋ฏธ ์ธ์คํด์ค๊ฐ ํด์ ๋์๋๋ฐ, ์ ๊ทผํ๊ฒ๋์ด ์ฑ์ด ํฌ๋์๋๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, ์ฆ ์์ง ์ฌ์ฉํ๊ณ ์๋ ์ธ์คํด์ค์ ๋ํด ํ ๋นํด์ ํ์ง ์๋๋ก ํ๊ธฐ ์ํด ARC๋ ์ผ๋ง๋ ๋ง์ properties, constants, ๋ณ์๋ค์ด ๊ฐ๊ฐ์ ํด๋์ค ์ธ์คํด์ค์ ์ฐธ์กฐํ๊ณ ์๋์ง ์ถ์ ํ๋ค.
- ์ฝ๊ฒ ๋งํ๋ฉด ํน์ A๋ผ๋ ์ธ์คํด์ค์ ๋ํด ์ฌ๊ธฐ์ ๊ธฐ์ ์ผ๋ง๋ ์ด๋ ์์ ์ฐธ์กฐํ๊ณ ์๋์ง ๊ด์ฐฐํ๊ณ ์๋ค๋ ๊ฒ
- ์ด๋ ๊ฒ ํด์, ARC๋ ์ธ์คํด์ค๊ฐ ์ ์ด๋ 1๊ฐ ์ด์์ ์ฐธ์กฐ๋ฅผ ๋ฐ๊ณ ์์ ๊ฒฝ์ฐ ํ ๋น์ ํด์ ํ์ง ์๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋์ ๊ตฌํํ ๋, ์ฐธ์กฐ๋ฅผ ํ๊ฒ ๋๋ฉด
strong
ํ ์ฐธ์กฐ๋ฅผ ํ๊ฒ ๋๋ค. - ๊ทธ๋ฅ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ฐธ์กฐํ๋ฉด +1 ํ๋๊ฑฐ์ผ.
์ฝ๋๋ก ์์๋ณด๊ธฐ
class Person {
let name: String
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
var reference1: Person?
var reference2: Person?
var reference3: Person?
์ด๋ ๊ฒ ํด๋์ค๊ฐ ์๋๋ฐ ์๋์์ optional๋ก ์ ์ธํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์์ง ์ธ์คํด์คํ ๋์ง ์์ ์ํ์ด๋ค.
reference1 = Person(name: "John Appleseed")
// Prints "John Appleseed is being initialized"
์ธ์คํด์คํ๋ฅผ ํ๊ฒ ๋๋ฉด ์์ฑ์๊ฐ ํธ์ถ๋๋ฉด์ ์ถ๋ ฅ์ ํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ์ธ์คํด์คํ ํ๊ฒ๋ ์ดํ์๋ ARC๋ ํด๋น ์ธ์คํด์ค์ ์ฐธ์กฐ๋ฅผ ์ถ์ ํ๊ฒ ๋๋ค. ์ง๊ธ์ reference1
์ด๋ผ๋ ๋ณ์๊ฐ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ reference count๋ 1์ด๊ณ , 1์ด๊ธฐ ๋๋ฌธ์ ํ ๋นํด์ ๋์ง ์๋๋ค.
reference2 = reference1
reference3 = reference1
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ๋๊ฐ์ ์ถ๊ฐ ๋ณ์๊ฐ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ฉด ์ด๋จ๊น? reference count๊ฐ 3์ด๋๋ค.
reference1 = nil
reference2 = nil
์ด๋ ๊ฒ ๋๊ฐ๋ฅผ ์ฐธ์กฐ ํด์ ํ๊ฒ ๋๋ฉด reference count๋ 1์ด ๋๊ฒ ๋ค.
reference3 = nil
// Prints "John Appleseed is being deinitialized"
์ด๋ ๊ฒ nil๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด, ์ต์ข ์ ์ผ๋ก reference count๋ 0์ด๋๊ณ , ํ ๋นํด์ ๋๋ค.
๊ฐํ ์ฐธ์กฐ ์ํ
- ์์์ ๋ณธ ๊ฒ์ ๊ฒฐ๊ตญ ์ธ์คํด์ค์ ๋ํด reference count๊ฐ ์ด๋ค์์ผ๋ก ๋ฐ์ํ ์ ์๋์ง๋ฅผ ์์๋ดค๋ค.
- ๊ต์ฅํ ํฉ๋ฆฌ์ ์ด๊ณ ์ ๋์ํ ๊ฒ ๊ฐ์ง๋ง, ํน์ ์ํฉ์์๋ ๊ทธ๋ ์ง ์๋ค.
- strong referece count๊ฐ 0์์๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๊ฐ ํ ๋นํด์ ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ
- ์ด๋ฐ ์ํฉ์ ๋๊ฐ์ class instance๊ฐ ์๋ก๋ฅผ ๊ฐํ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
- ์ด๋ฐ ์ํฉ์
strong reference cycle
์ด๋ผ ํ๋ค. weak
๋๋unowned
reference๋ฅผ ์ฌ์ฉํด์ ์ด๋ฐ ์ํฉ์ ํด๊ฒฐํ ์ ์๋ค.
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") }
}
- ๋ณด๊ฒ ๋๋ฉด, Person์ ํ๋กํผํฐ์ธ apartment๊ฐ ์๊ณ ,
- Apartment๋ Person์ ํ๋กํผํฐ๋ก ๊ฐ์ง๊ณ ์๋ค.
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
- ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์ด๋ฌํ ์ํฉ์ด๋ค. ๋ณ์๋ค์ด ์์ฑ๋ ๊ฐ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์๋ค.
- ์ด์ ์ฌ๊ธฐ์ ๊ฐ ํด๋์ค ์ธ์คํด์ค ํ๋กํผํฐ๊ฐ ์๋ก์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
- ์ด๋ ๊ฒ ์ ์ธํ๊ฒ ๋๋ฉด, ์ผ๋จ john instance์ reference count + 1
- unit4A instance๋ reference count + 1 ๋๊ฒ ๋๋ค.
john!.apartment = unit4A
unit4A!.tenant = john
- ์กด์ฌํ๋ ๊ฒ์ด ํ์คํ๋ ๊ฐ์ ์ธ๋ํ์ ์ฌ์ฉํ๋ค.
- ๊ทธ๋ฌ๋ฉด ์์ ๊ฐ์ ๊ทธ๋ฆผ์ด ๋ง๋ค์ด์ง๋ค.
- ๊ฐ๊ฐ์ ์ธ์คํด์ค์ ์๋ property๋ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์๋ค.
- ํ์ฌ Person instance์ ์ฐธ์กฐ ๊ฐ์๋ 2๊ฐ, Apartment instance์ ์ฐธ์กฐ ๊ฐ์ ์ญ์ 2์ด๋ค.
john = nil
unit4A = nil
- ์ด ์ํ์์ john๊ณผ unit4A์ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
- ์ฌ์ ํ ์ฐธ์กฐ๊ฐ์๋ ๊ฐ๊ฐ 1, 1์ผ๋ก ํด๋น ์ธ์คํด์ค๋ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋นํด์ ๋์ง ์๋๋ค.
- ์ด ๋ฌธ์ ๋ ๊ต์ฅํ ์ฌ๊ฐํ๋ค. ์ ๊ทผ ์์ฒด๋ ๋ถ๊ฐ๋ฅํ ์ํฉ์, ์๋ํ ๋ฐ๋๋ก ๋์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๊ธฐ ๊ฐ์ด ๊ณ์ํด์ ๋์ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ค.
๊ฐํ ์ฐธ์กฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ค์ํํธ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. weak
, unowned
์ด ๋๊ฐ์ง์ด๋ค.
weak
- ์ธ์คํด์ค๊ฐ ์์ ๋, ๋ ์งง์ ์์ ์ฃผ๊ธฐ, ์ฆ ๋ ๋นจ๋ฆฌ ์์ด์ง ๊ฒ ๊ฐ์ ๋ํํ weak์ ๋จ๋ค.
- ์์ ์๋ผ๋ฉด, ์ํํธ์ ์ธ์ ์๋ ๋ ์์ฃผ๋ฐ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ์ ์์์ weak ๋ค๋ ๊ฒ์ด ์ข๋ค.
- ํต์ฌ์ ์ฐธ์กฐํ๋ ๊ฐํ ์ฐธ์กฐ๋ฅผ ํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐํ ์ฐธ์กฐ count๊ฐ 0์ด ๋ ๊ฒฝ์ฐ, ARC๋ ์ด๋ฅผ ํ ๋น ํด์ ํด๋ฒ๋ฆฐ๋ค.
- ๊ทธ๋ฌ๋ฉด weak ํค์๋๋ฅผ ๋ฌ๊ณ ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๋ ๋ ์์ โ์? ๋ ๊ณ์ ์๋ค๊ณ ์๊ฐํ๋ ์ค์ ใ ใ โ ์ด๋ฐ์์ผ๋ก ์ผ์ ํ๊ฒ ๋๋ค.
- ์ฆ ์ฐ๋ ๊ธฐ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ ๊ฒ์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ARC๋ ์ธ์คํด์ค๊ฐ ํด์ ๋์์ ๋, weak ์ฐธ์กฐ๋ฅผ ํ ๋ณ์์ ๋ํด
nil
์ ์ค๋ฒ๋ฆฐ๋ค. - ์ด๋ฌํ ๊ฒ์ ๋ฐํ์์์ ๋ฒ์ด์ง๋คโฆ!!!!
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์
weak
์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด var ๋ก ์ ์ธํด์ผ ํ๋ค. - ๊ทธ๋ฆฌ๊ณ ํ ๋น์ด ํด์ ๋ ๋
optional
์ด ๋๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑดoptional
๋ก ์ ์ธํด์ผ ํ๋ค.
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
์๊น์ ๋ฌ๋ฆฌ Apartment์์ tenant๊ฐ weak์ผ๋ก ์ ์ธ๋์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ์์ ๊ฐ์ด ์ ์ธ์ ํด์ค ์ํ์ด๋ค. ์ด์ ์ด์ํฉ์์ john์ ์ฐธ์กฐ๋ฅผ ๋์ด๋ณด์.
john = nil
// Prints "John Appleseed is being deinitialized"
tenant๋ weak ์ฐธ์กฐ์ด๊ธฐ ๋๋ฌธ์ Person instance์ reference count๋ 0์ด ๋์ด ํ ๋น์ด ํด์ ๋๋ค. ARC๋ weak์ผ๋ก ์ฐธ์กฐํ๊ณ ์๋ tenant ๋ณ์์ ๊ฐ์ nil๋ก ๋ณ๊ฒฝํ๋ค.
์ด์ ์ด ์ํฉ์์ unit4A๋ ํ ๋น์ ํด์ ํด๋ณด์.
unit4A = nil
// Prints "Apartment 4A is being deinitialized"
์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค! Apartment instance๋ reference count๊ฐ 1์ด์๊ธฐ ๋๋ฌธ์, unit4A๊ฐ ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ ์๊ฐ 0์ด๋์ด ํ ๋น์ด ํด์ ๋์๋ค.
unowned
unowned
์ญ์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ํ์ง๋ ์๋๋ค.- ๊ทธ๋ฐ๋ฐ, ์ด๊ฑด ๋ค๋ฅธ ์ธ์คํด์ค๊ฐ ๊ฐ๊ฑฐ๋ ๊ฑฐ ๊ธด ์์ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉํ๋ค.
weak
์ฐธ์กฐ์ ๋ค๋ฅด๊ฒ, ์ด๋ ์์ ํญ์ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ค.- ์ฆ,
unowned
๋ก ์ ์ธํ๊ฒ ๋๋ฉด, ARC๋ value๋ฅผ 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
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit { print("Card #\(number) is being deinitialized") }
}
- Person class์ ์ ์ฉ์นด๋ ํด๋์ค์ด๋ค.
- ์๋ก๋ ์๋ก์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ํ๋กํฐํผ๋ก์ ์ ์ฅํ๋ค.
- ์ด๋ฌํ ์ํฉ์ ๊ฐํ ์ฐธ์กฐ ์ํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ ์ํ์ด๋ค.
- ์ฌ๊ธฐ์ ๊ฐ์ฒด๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ดํด๋ณด์์ผ ํ๋ค.
- ์ด์ ์ ์ํํธ์ ์ธ์ ์์ ๊ฒฝ์ฐ ์ธ์ ์๊ฐ ์์ด๋ ์ํํธ๋ ์๋ฏธ๋ก ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ค.
- ํ์ง๋ง ์ง๊ธ ๊ณ ๊ฐ๊ณผ ์ ์ฉ์นด๋์์๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
- ๊ณ ๊ฐ์ ์ ์ฉ์นด๋๊ฐ ์์ด๋ ๊ทธ๋ง, ์์ด๋ ๊ทธ๋ง์ด์ง๋ง
- ์ ์ฉ์นด๋๋ ์ด ์ฃผ์ธ์ด ๋ช ํํด์ผ ์ฌ์ฉ๊ฐ์น๋ฅผ ๊ฐ๋๋ค.
- ์ด๋ฌํ ์ ์ ๋ฐ์ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ์ฉ์นด๋ ์ด๊ธฐํ์ ๊ณ ๊ฐ ๋ฌด์กฐ๊ฑด ์์ด์ผ ํจ
- ๊ณ ๊ฐ์ ์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธํ์ง ์์
- ๋ฐ๋๋ก ๊ณ ๊ฐ ํด๋์ค์์๋ ์นด๋๋ฅผ ์ต์ ๋๋ก ์ ์ธํจ
- ๊ณ ๊ฐ์ด ๊ฐ์ด๋ฏ๋ก ์นด๋๋ฅผ ๊ฐํ ์ฐธ์กฐ๋ฅผ ํ๊ณ ์์
์ ์ด์ , ์ค์ ๋ก ๋์๊ฐ๋ ๊ฑด ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์ดํดํ์.
var john: Customer?
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
- ์ ์ด๋ ๊ฒ ์ ์ธํด๋ณด์.
- ์ผ๋จ ๊ณ ๊ฐ์ ํ๋ ๋ง๋ค์๊ณ , ๊ทธ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ์ ์ฉ์นด๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ ์ฐธ์กฐํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์ด๋ฌํ ์ํฉ์ด๋ค. ์ด ์ํ์์ john์ ์ฐธ์กฐ๋ฅผ ํด์ฌํด ๋ณด์.
๊ทธ๋ฌ๋ฉด ์ด๋ฌํ ์ํ๊ฐ ๋ ํ ๋ฐ, unowned๋ก ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ณ ๊ฐ ์ธ์คํด์ค๋ ํ ๋น ํด์ ๋๋ค. ์ฌ๊ธฐ์, ๊ทธ๋ฌ๋ฉด ์ ์ฉ์นด๋ ์ธ์คํด์ค๋ ๊ฐํ ์ฐธ์กฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ ๋น ํด์ ๋๋ค.
john = nil
// Prints "John Appleseed is being deinitialized"
// Prints "Card #1234567890123456 is being deinitialized"
์ ๋ฆฌ
- weak: ํด๋น ๋ณ์๊ฐ nil์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ ๋
- unowned: ํด๋น ๋ณ์๊ฐ nil์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ ๋
Garbage Collector, Reference Counting ๋น๊ต
|๊ตฌ๋ถ|GC|RC|
|::----|::|::|
|์ฐธ์กฐ ๊ณ์ฐ ์์ |Run Time
์ดํ ์คํ ๋์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฐธ์กฐ๋ฅผ ์ถ์ ํ์ฌ ์ฌ์ฉํ์ง ์๋ instance๋ฅผ ํด์ ํจ|Compile Time
์ปดํ์ผ ์์ ์ ์ธ์ ์ฐธ์กฐ๋๊ณ ํด์ ๋๋์ง ๊ฒฐ์ ๋์ด ๋ฐํ์ ๋ ๊ทธ๋๋ก ์คํ๋จ|
|์ฅ์ |์ธ์คํด์ค๊ฐ ํด์ ๋ ํ๋ฅ ์ด ๋์
(RC์ ๋นํด)|๊ฐ๋ฐ์๊ฐ ์ฐธ์กฐ ํด์ ์์ ์ ํ์
ํ ์ ์์
RunTime ์์ ์ ์ถ๊ฐ ๋ฆฌ์์ค๊ฐ ๋ฐ์ํ์ง ์์|
|๋จ์ |๊ฐ๋ฐ์๊ฐ ์ฐธ์กฐ ํด์ ์์ ์ ํ์
ํ ์ ์์
RunTime ์์ ์ ๊ณ์ ์ถ์ ํ๋ ์ถ๊ฐ ๋ฆฌ์์ค๊ฐ ํ์ํ์ฌ ์ฑ๋ฅ์ ํ ๋ฐ์๋ ์ ์์|์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ ์ ์๊ตฌ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์์ ์ ์์|