iOS/🟠 Swift

Strong Reference Cycle - Memory

woozzang 2021. 1. 3. 22:26

"κ°•ν•œ μ°Έμ‘° μˆœν™˜"

ARC의 μž‘λ™ 및 κ°•ν•œ 참쑰의 κ·œμΉ™μ„ 잘 λͺ¨λ₯΄κ³  μ‚¬μš©ν•  λ•Œ λ°œμƒν•˜λŠ” μ΄μŠˆμž…λ‹ˆλ‹€.

ARC와 κ΄€λ ¨λ˜μ—ˆμœΌλ―€λ‘œ μ°Έμ‘° νƒ€μž… μ‚¬μ΄μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€. (class, closure)

 

λ°œμƒ μ˜ˆμ‹œ

κ°œλ°œμžκ°€ μΈμŠ€ν„΄μŠ€μ— nil을 ν• λ‹Ήν•˜λŠ” κ²½μš°λŠ” μ–Έμ œμΌκΉŒμš”?

 

μΈμŠ€ν„΄μŠ€κ°€ 더 이상 μ°Έμ‘°ν•  ν•„μš”κ°€ μ—†μ–΄μ„œ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œμ‹œν‚€κ³  싢을 경우일 κ²ƒμž…λ‹ˆλ‹€.

 

μ˜λ„λŠ” μΈμŠ€ν„΄μŠ€μ˜ λ©”λͺ¨λ¦¬ ν•΄μ œμ˜€μ§€λ§Œ, μΈμŠ€ν„΄μŠ€κ°€ ν•΄μ œλ˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆμŒκ³Ό λ™μ‹œμ— 접근도 ν•  수 μ—†λŠ” κ²½μš°κ°€ μƒκΉλ‹ˆλ‹€.

 

λ°”λ‘œ κ°•ν•œ μ°Έμ‘° μˆœν™˜μ΄ λ°œμƒν•œ κ²½μš°μž…λ‹ˆλ‹€.


 

νƒ€μž…

μΈμŠ€ν„΄μŠ€μ™€ μΈμŠ€ν„΄μŠ€ 사이(이번 κΈ€), μΈμŠ€ν„΄μŠ€μ™€ κ·Έ μΈμŠ€ν„΄μŠ€μ˜ 속성에 μ €μž₯된 ν΄λ‘œμ € 사이


 

μ½”λ“œ

μΈμŠ€ν„΄μŠ€κ°€ μ„œλ‘œ κ°•ν•œ μ°Έμ‘° ν•˜λŠ” 경우, μΈμŠ€ν„΄μŠ€μ— nil을 넣어도 μΈμŠ€ν„΄μŠ€μ˜ 속성이 λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λ₯Ό μΊ‘μ²˜ν•˜κ³  있기 λ•Œλ¬Έμ—

 

μ°Έμ‘° 횟수 (Reference Counting)이 0이 λ˜μ§€ μ•Šμ•„μ„œ μ ‘κ·Ό ν•˜μ§€ λͺ»ν•˜μ§€λ§Œ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλŠ” κ²½μš°μž…λ‹ˆλ‹€.

 

μ•„λž˜μ˜ μ½”λ“œλ₯Ό 예둜 보면, kim 의 room 속성이 Room μΈμŠ€ν„΄μŠ€λ₯Ό μΊ‘μ²˜ν•˜κ³  있고,  room의 person 속성이 vice versa둜 μΊ‘μ²˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

이후 kim κ³Ό room μ—λŠ” nil을 ν• λ‹Ήν•˜μ—¬ μ°Έμ‘° 횟수λ₯Ό κ°μ†Œμ‹œμΌ°μ§€λ§Œ, μ •μž‘ κ·Έ μΈμŠ€ν„΄μŠ€λ“€μ˜ 속성이 μΊ‘μ²˜ν•˜κ³  있기 λ•Œ

문에 μ°Έμ‘° νšŸμˆ˜λŠ” 1이고, ARC에 μ˜ν•΄ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

 

class Person {
    ...
    var room: Room?
    ...
}

class Room {
    ...
    var person: Person?
    ...
    deinit {
        print("deinit")
    }
}

var kim: Person? = Person() // Person Instance (μ΄ν•˜ P.I) μ°Έμ‘° 횟수 : 1
var room: Room? = Room() // Room Instance (μ΄ν•˜ R.I) μ°Έμ‘° 횟수 : 1

room?.person = kim // P.I 참쑰 횟수 : 2
kim?.room = room // R.I 참쑰 횟수 : 2

kim = nil  // P.I 참쑰 횟수 : 1
room = nil // R.I 참쑰 횟수 : 1

// 이 ν›„ kim, room μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μ—†μ§€λ§Œ, ARCμ—μ˜ν•΄ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆκ²Œ 됨

 

 

 

 

끝.


λ‹€μŒ κΈ€: Weak Reference - Memory

 

Weak Reference - Memory

" μ•½ν•œ μ°Έμ‘° " κ°•ν•œ μ°Έμ‘° 사이클을 ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법 쀑 ν•˜λ‚˜ μž…λ‹ˆλ‹€. μ°Έμ‘° νƒ€μž…μ˜ λ³€μˆ˜μ˜ μ„ μ–Έ μ•žμ— 'weak' ν‚€μ›Œλ“œλ₯Ό μ¨μ£Όμ–΄μ„œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. κ°•ν•œ 참쑰와 달리 μ•½ν•œ μ°Έμ‘°λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ†Œμœ  ( retai

woozzang.tistory.com