iOS/Swift

[Swift] ARC(Automatic Reference Counting)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

κ²½ν‘Έ 2023. 3. 4. 18:00
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~

 

μ˜€λŠ˜μ€ ARC에 λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€.

 

 

 


 

 

ARCκ°€ λ©”λͺ¨λ¦¬ μ˜μ—­ μ€‘μ—μ„œ Heap μ˜μ—­μ„ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—

λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄μ„œ λ¨Όμ € μ •λ¦¬ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ˜μ—­

ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ, μ»΄ν“¨ν„°μ˜ λ©”λͺ¨λ¦¬λŠ” μ—¬λŸ¬ 개의 μ˜μ—­μœΌλ‘œ λ‚˜λ‰˜μ–΄ μžˆλŠ”데

이 μ€‘μ—μ„œ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ μ˜μ—­μ€ stackκ³Ό heapμž…λ‹ˆλ‹€.

Stack

Stack은 ν•¨μˆ˜ 호좜과 κ΄€λ ¨λœ 정보λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μž…λ‹ˆλ‹€. ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€, ν•΄λ‹Ή ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜, 그리고 ν•¨μˆ˜μ˜ λ°˜ν™˜ μ£Όμ†Œ 등이 μŠ€νƒμ— μ €μž₯λ©λ‹ˆλ‹€. ν•¨μˆ˜μ˜ 싀행이 λλ‚˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ—μ„œ μ‚¬μš©λœ λ©”λͺ¨λ¦¬λŠ” μŠ€νƒμ—μ„œ μ œκ±°λ©λ‹ˆλ‹€.

Heap

Heap은 ν”„λ‘œκ·Έλž¨μ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ˜μ—­μž…λ‹ˆλ‹€. κ°œλ°œμžκ°€ ν•„μš”μ— 따라 λ©”λͺ¨λ¦¬λ₯Ό λ™μ μœΌλ‘œ ν• λ‹Ήν•˜κ±°λ‚˜, ν•΄μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜μ—­μ€ stackκ³Ό 달리 λ©”λͺ¨λ¦¬μ˜ 크기가 λ™μ μœΌλ‘œ λ³€ν•©λ‹ˆλ‹€.

 

 

ARC (Automatic Reference Counting)λž€

ARC (Automatic Reference Counting)λŠ” RCλ₯Ό 톡해 μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•΄ μ£ΌλŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

즉, ARCλ₯Ό μ‚¬μš©ν•˜λ©΄ μˆ˜λ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 관리에 λŒ€ν•œ 였λ₯˜λ₯Ό 쀄일 수 있게 λ©λ‹ˆλ‹€.

 

ARCλŠ” 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ μ–Έμ œ μ°Έμ‘°λ₯Ό 끊고, μ–Έμ œ λ‹€μ‹œ μ°Έμ‘°ν•˜λŠ”μ§€λ₯Ό μΆ”μ ν•©λ‹ˆλ‹€.

이λ₯Ό 톡해 객체의 RCλ₯Ό μ¦κ°€μ‹œν‚€κ³ , μ°Έμ‘°κ°€ λλ‚˜λ©΄ μ°Έμ‘° κ³„μˆ˜λ₯Ό κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€.

 

ARCλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œλ„ κ°•ν•œ μˆœν™˜ 참쑰와 같은 λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•½ν•œ μ°Έμ‘° (weak reference)와 λΉ„μ†Œμœ  μ°Έμ‘° (unowned reference)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ°Έμ‘° μˆœν™˜μ„ μ΅œμ†Œν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

 

RC (Reference Counting)

RC (Reference Counting)λŠ” 객체가 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ  수 μžˆλ„λ‘ μ°Έμ‘° κ³„μˆ˜λ₯Ό μΆ”μ ν•˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. μ°Έμ‘° κ³„μˆ˜λŠ” 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜λ‚˜ μƒμˆ˜μ˜ 수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ 없을 λ•Œ, 객체λ₯Ό μžλ™μœΌλ‘œ ν•΄μ œν•©λ‹ˆλ‹€.

 

μ˜ˆμ‹œ

- μ•žμ„œ μ΄μ•ΌκΈ°ν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 방지λ₯Ό μœ„ν•œ μ•½ν•œ μ°Έμ‘°λ₯Ό ν¬ν•¨ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

class Person {
    var name: String
    weak var apartment: Apartment?

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) deallocated")
    }
}

class Apartment {
    var number: Int
    var tenant: Person?

    init(number: Int) {
        self.number = number
    }

    deinit {
        print("\(number) deallocated")
    }
}

var person1: Person? = Person(name: "κ²½ν‘Έ")
var apartment1: Apartment? = Apartment(number: 123)

person1?.apartment = apartment1
apartment1?.tenant = person1

person1 = nil
apartment1 = nil

// 좜λ ₯ κ²°κ³Ό: 
// "κ²½ν‘Έ deallocated"
//  "123 deallocated"

 

μœ„ μ½”λ“œλ₯Ό 보면

person1 객체가 apartment1 객체λ₯Ό μ•½ν•œ 참쑰둜 μ°Έμ‘°ν•˜κ³  μžˆλŠ” μƒνƒœμΈ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. (weak var)

이후, apartment1 객체가 person1 객체λ₯Ό μ°Έμ‘°ν•˜λ„λ‘ μ„€μ •ν•˜κ³  λ‚˜μ„œ

person1κ³Ό apartment1을 ν•΄μ œν•˜λ©΄

 

Person 객체인 person1을 ν•΄μ œν•  λ•Œ, Apartment 객체인 apartment1의 μ•½ν•œ 참쑰도 ν•¨κ»˜ ν•΄μ œκ°€ 되게 λ˜μ–΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 방지할 수 있게 λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

 


 

 

 

μ˜€λŠ˜μ€ μ—¬κΈ°κΉŒμ§€ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€!

 

그럼 이만 πŸ‘‹πŸ»πŸ‘‹πŸ»πŸ‘‹πŸ»

 

λ°˜μ‘ν˜•