ARC๋ compile time์ ์๋์ผ๋ก retain, release ๋ฉ์๋๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
์ด๋ฐ์์ผ๋ก complie time์ ์ฝ์
์ด ์ด๋ฃจ์ด์ง๋ฉด, runtime๋ ์ธ์คํด์ค์ ์์ฑ, ์ฐธ์กฐ๊ฐ ์ผ์ด๋ ๋ ๋ง๋ค ๋ฉ์๋๊ฐ ์คํ๋๋ฉฐ ์๋์ผ๋ก Retain Count๊ฐ ์ด๋ฃจ์ด์ง๋ ๋ฐฉ์์
๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ Count๊ฐ 0์ด ๋๋ฉด deinit
์ ํตํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ฉ๋๋ค.
Retain Count(RC)๋ ์ธ์คํด์ค์ ์์ฑ ์ +1์ด ๋๊ณ ํด๋น ์ธ์คํด์ค๊ฐ ์ฐธ์กฐ๋ ๋ +1์ด ๋ฉ๋๋ค. ๋ฐ๋๋ก ์ฐธ์กฐ๊ฐ ํด์ ๋๋ฉด -1์ด ๋ฉ๋๋ค.
strong์ด ์๋๋ผ weak์ผ๋ก ์ฐธ์กฐํ ๊ฒฝ์ฐ RC๋ ์ฆ๊ฐํ์ง ์์ต๋๋ค.
ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋์ ํด์ง๋ ๋ ๋ก๊ทธ ์ถ๋ ฅ
class Person {
let name: String
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
3๊ฐ์ ๋ณ์ ๋ชจ๋ ์ต์ ๋ => ์ด๊ธฐ๊ฐ nil
var reference1: Person?
var reference2: Person?
var reference3: Person?
Person ์ธ์คํด์ค ์์ฑ, RC = 1
reference1 = Person(name: "John Appleseed")
// Prints "John Appleseed is being initialized"
Person ์ธ์คํด์ค RC = 3
reference2 = reference1
reference3 = reference1
Person ์ธ์คํด์ค RC = 1
reference1 = nil
reference2 = nil
Person ์ธ์คํด์ค RC = 0, ๋ฉ๋ชจ๋ฆฌ ํด์ง
reference3 = nil
// Prints "John Appleseed is being deinitialized"