[WWDC 21] ARC in Swift: Basics and beyond
μμ½ π
ARC λ μ€λΈμ νΈ(μΈμ€ν΄μ€)μ life timeμ΄ λλ λ deallocate ν΄μ€λ€.
κ·Έλ λ€λ©΄ ARC λ μ€λΈμ νΈμ life time μ΄ λλμ§ μ΄λ»κ² μμ μλ κ²μΌκΉ? Referecne count λ₯Ό μΆμ νλ€.
ARC μ΅μ νμ μνμ¬, observed obejct life time κ³Ό guaranteed mininum object life time μ΄ λ€λ₯Ό μ μλ€.
Observed object life time μ λ―Έλμ μ€μννΈ μ»΄νμΌλ¬ ꡬνμ λ°λΌ λ³λ λ μ μμΌλ, μ΄κ²μ μμ‘΄νλ μ½λλ μ μ¬μ λ²κ·Έλ₯Ό ν¬ν¨ν κ²μ΄λ―λ‘ κ°λ₯ν μμ ν΄μΌνλ€.
ν€μλ μ€μ¬ μ 리 π
object life time
μ€μννΈμμ object life time μ μ¬μ© κΈ°λ° ( use-based ) μ΄λ€.
μ¬μ©(use) μ΄λ reference λ₯Ό ν΅ν΄ μ€λΈμ νΈμ μμ±μ μ κ·Όνκ±°λ, λ©μλλ₯Ό νΈμΆνλ νμλ₯Ό ν¬ν¨νλ€.
μ΅μ΄μ μ¬μ©μ init() μμ μμλλ€.
init() λμμ νμ μ€λΈμ νΈλ₯Ό μμ±νλ©°, reference count λ₯Ό 1λ‘ μ€μ νλ€.
reference λ₯Ό λ§μ§λ§μΌλ‘ μ¬μ©ν μ§ν, μ€λΈμ νΈμ life time μ μ’ λ£λλ€.
reference copy λμμ μ€λΈμ νΈμ μλ‘μ΄ reference λ₯Ό λ§λ€λ©°, reference count λ₯Ό 1 μ¦κ°μν¨λ€.
let obejct1 = SomeObject()
let object2 = object1 //reference copy
...
retain, release
μ€μννΈ μ»΄νμΌλ¬κ° reference μ¬μ© κΈ°λ°μΌλ‘ μ½λμ μ λͺ λ Ήμ΄λ€μ μ½μ νλ€.
μλ‘μ΄ reference κ° μ¬μ© μμλκΈ° μ§μ , μ€μννΈ μ»΄νμΌλ¬λ retain λͺ λ Ήμ΄λ₯Ό μΆκ°νλ€.
retain λͺ λ Ήμ΄λ μ€λΈμ νΈμ reference count λ₯Ό 1 μ¦κ°μν¨λ€.
reference λ₯Ό λ§μ§λ§μΌλ‘ μ¬μ©ν μ§ν, μ€μννΈ μ»΄νμΌλ¬λ release λͺ λ Ήμ΄λ₯Ό μΆκ°νλ€.
release λͺ λ Ήμ΄λ μ€λΈμ νΈμ reference count λ₯Ό 1 κ°μμν¨λ€.
λ¨, init() μ μ€λΈμ νΈμ refCount λ₯Ό 1λ‘ μ€μ νλ―λ‘ λ°λ‘ retain λͺ λ Ήμ΄κ° μΆκ°λμ§ μλλ€.
{
let obejct1 = SomeObject()
retain // object2μ reference κ° μμλλ―λ‘, μ»΄νμΌλ¬κ° μΆκ°νλ€.
let object2 = object1 //reference copy
release // object1 μ reference κ° μ’
λ£λμλ€.
object2.someMethod()
release // object2 μ reference κ° μ’
λ£λμλ€.
}
observed life time
ARC μ μ΅μ ν λ±μ μ΄μ λ‘ λ³λμ μ΄λ€.
μ΄κ²μ μμ‘΄νλ μ½λλ₯Ό μμ±νλ©΄ μ μ¬μ λ²κ·Έλ₯Ό ν¬ν¨νλ κ²μ΄λ€.
weak, unowned λ₯Ό μ¬μ©νλ©΄ κ²½μ°μ λ°λΌ observed life time μ μμ‘΄νκ² λλ€.
νμ strong refernce λ₯Ό μ¬μ©νλ κ²μ΄ κ°μ₯ λͺ νν ν΄κ²°λ²μ΄λ€.
{
let obejct1 = SomeObject()
object1.someMethod()
release -------- guaranteed life time --------
// νμ§λ§ ARC μ΅μ νμ μν΄ μμ§ object1 μ΄ deallocated λμ§ μμ μ μκ³ ,
// λ°λΌμ μ΄ μμ μ object1 μ λ©λͺ¨λ¦¬ μ κ·Όμ΄ κ°λ₯ν μ μλ€.
// μ΄ λ³΄μ₯λμ§ μμ μ κ·Ό κ°λ₯ μκ°μ observed life time μ΄λΌκ³ νλ€.
}
guranteed minimum life time
initialization λΆν° μ€λΈμ νΈμ λν λͺ¨λ λ νΌλ°μ€μ λ§μ§λ§ μ¬μ© μμ κΉμ§λ₯Ό κ°λ¦¬ν¨λ€.
μ΄ life time μ κ³ μ μ μ΄κΈ° λλ¬Έμ μ¬κΈ°μ μμ‘΄νλ κ²μ λ¬Έμ κ° μλ€.
{
let obejct1 = SomeObject()
object1.someMethod()
release -------- guaranteed life time --------
// reference μ λ§μ§λ§ μ¬μ© μ§ν release λλ©°, object1 μ life time μ μ’
λ£λλ€.
}
weak, unowned
reference count μ κ΄μ¬νμ§ μλλ€.
μ£Όλ‘ reference cycle μ λ°©μ§νκΈ° μν΄ μ¬μ©λλ€.
object life time μ νΉμ± λλ¬Έμ, μ¬μ©μ λ°λΌ potential bugs λ₯Ό ν¬ν¨ν μ μλ€.
weak νΉμ unowned μ μ¬μ© μ΄μ κ° λ¨μ§ reference cycle λ°©μ§ λͺ©μ μ΄λΌλ©΄, λμμ μ°Ύμμ μμ ν μ μλ€.
μμ) μ¬μ΄ν΄ κ΄κ³λ₯Ό νΈλ¦¬ κ΄κ³λ‘ λ³κ²½
μμ μ 체 μ 리 보λ¬κ°κΈ° ππ»
μ€λλ λλ μ±μ₯νλ€!!π₯
π€ [Back to the Basics] π»
μ£Όλμ΄ iOS κ°λ°μ μ°μ§±μ κΈ°μ λΈλ‘κ·Έμ λλ€.
[μ°Έκ³ μλ£ ππ»βοΈ]
https://developer.apple.com/videos/play/wwdc2021/10216/