iOS/🟠 Swift

Closure Capture List - Memory

woozzang 2021. 1. 5. 13:49

μ–Έμ œ 이 이슈λ₯Ό μœ λ…ν•΄μ•Ό ν• κΉŒ

ν΄λ‘œμ €λ₯Ό μΈμŠ€ν„΄μŠ€ 속성에 μ €μž₯ν•  λ•Œμž…λ‹ˆλ‹€.


 

λ°œμƒν•˜λŠ” 상황

ν΄λ‘œμ €μ˜ κ°•ν•œ μ°Έμ‘° μˆœν™˜μ€ λ‹€μŒ 상황에 λ°œμƒν•©λ‹ˆλ‹€.

 

1. ν΄λ‘œμ €κ°€ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°μΌ λ•Œ

2. ν΄λ‘œμ €μ˜ κ°’ νšλ“ 상황

 

ν΄λ‘œμ € λ‚΄λΆ€μ—μ„œ self.(propertyName)μ΄λ‚˜, self.(methodName)처럼 μΈμŠ€ν„΄μŠ€μ˜ μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ,

ν΄λ‘œμ €λŠ” selfλ₯Ό νšλ“ν•˜λ―€λ‘œ κ°•ν•œ μ°Έμ‘° μˆœν™˜μ΄ λ°œμƒν•©λ‹ˆλ‹€.

 

λ¬Έμ œλŠ” ν΄λ‘œμ €κ°€ νšλ“ν•œ μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘° 카운트λ₯Ό μ¦κ°€μ‹œμΌœ λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό λ°©μ§€ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 즉, κ°•ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜κ²Œ λ©λ‹ˆλ‹€.
단, ν΄λ‘œμ € λ‚΄λΆ€μ—μ„œ self 속성을 μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜μ—¬ μ ‘κ·Όν•œλ‹€κ³  해도 μ°Έμ‘° νšŸμˆ˜λŠ” ν•œ 번만 μ¦κ°€ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

μ•žμ„  κΈ€μ—μ„œλŠ” μ°Έμ‘° νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ™€ μ°Έμ‘° νƒ€μž… μΈμŠ€ν„΄μŠ€ λ•Œλ¬Έμ— κ°•ν•œ μ°Έμ‘° μˆœν™˜μ΄ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

ν΄λ‘œμ €λ„ μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— 같은 상황이 λ°œμƒν•œλ‹€κ³  생각할 수 μžˆμŠ΅λ‹ˆλ‹€.


 

ν•΄κ²° 방법

해결방법은 Closure Capture Listλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

이것을 μ‚¬μš©ν•˜λ©΄ ν΄λ‘œμ €κ°€ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘°λ₯Ό νšλ“ν•  λ•Œ, κ°•ν•œ μ°Έμ‘° λŒ€μ‹  μ•½ν•œ μ°Έμ‘°λ‚˜ λ―Έμ†Œμœ  μ°Έμ‘°λ₯Ό ν•  수 있게 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


 

Syntax

Closure Capture ListλŠ” 리슀트 내에 λͺ…μ‹œν•œ 값듀을 νšλ“ν•˜λŠ”λ°, κ°’μ˜ νƒ€μž…μ— 따라 λ™μž‘μ΄ 쑰금 λ‹€λ¦…λ‹ˆλ‹€.

 

μš°μ„  κ°’ νƒ€μž…μΌ λ•Œ, νšλ“ν•  λ‹Ήμ‹œμ˜ 값을 μΊ‘μ²˜ν•˜μ—¬ μƒˆλ‘œμš΄ μƒμˆ˜λ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

 

λ”°λΌμ„œ ν΄λ‘œμ € λ‚΄μ—μ„œ 값을 λ³€κ²½ν•œλ‹€κ³  해도, μ‹€μ œ λ³€μˆ˜μ—λŠ” 영ν–₯이 μ—†μŠ΅λ‹ˆλ‹€.

 

값을 Capture List에 λ„£μ§€ μ•ŠμœΌλ©΄ μƒˆλ‘œμš΄ μƒμˆ˜λ‘œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, ν΄λ‘œμ € λ°”λ””μ—μ„œμ˜ 변경이 μ‹€μ œλ‘œ λ°˜μ˜λ©λ‹ˆλ‹€.

 

μ°Έμ‘° νƒ€μž…μΌ λ•ŒλŠ” λ˜‘κ°™μ΄ μƒμˆ˜λ‘œ μ΄ˆκΈ°ν™” ν•˜μ§€λ§Œ, μ°Έμ‘° νƒ€μž… μ΄λ―€λ‘œ κ·Έ 속성은 λ³€κ²½ν•  수 있고 μ‹€μ œλ‘œ λ°˜μ˜λ©λ‹ˆλ‹€.

 

κ΄€λ ¨ κΈ€: κ°’ νƒ€μž… vs μ°Έμ‘° νƒ€μž…

 

λ‹€λ§Œ μ°Έμ‘° νƒ€μž…μ—μ„œλŠ” κ·Έ 값을 μ–΄λ–»κ²Œ νšλ“ν•  것인지 정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€. (κ°•ν•œ μ°Έμ‘°, μ•½ν•œ μ°Έμ‘°, λ―Έμ†Œμœ  μ°Έμ‘°)

 

방법은 ν΄λ‘œμ € λ‚΄λΆ€μ˜ 첫 뢄에 ` [ μ°Έμ‘° 방법 μΊ‘μ²˜ν•  κ°’... ]  in ` ν˜•νƒœλ‘œ 적어주면 λ©λ‹ˆλ‹€.

 

class Person {
    let name: String
    let age: Int
    
    /* 1 */
    lazy var makeProfile: () -> String = {[weak self] in
        /* 2 */
        return "Name: \(self?.name)\nAge:\(self?.age)"
    }
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

 

/* 1 */ μ—μ„œ lazy (μ§€μ—° μ €μž₯ 속성)λ₯Ό λΆ™μ—¬μ€€ μ΄μœ λŠ” ν΄λ‘œμ €κ°€ 싀행될 μ‹œμ μ— λ‹€λ₯Έ 속성이 아직 μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 속성에도 μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

κ΄€λ ¨ κΈ€: self의 μ ‘κ·Ό κ°€λŠ₯ μ‹œμ 

 

/* 2 */ μ—μ„œ μ˜΅μ…”λ„ μ–Έλž˜ν•‘μ„ ν•΄μ€€ μ΄μœ λŠ”,  self 속성을 weak으둜 μΊ‘μ²˜ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ•½ν•œ μ°Έμ‘°λŠ” μ˜΅μ…”λ„ νƒ€μž…μž…λ‹ˆλ‹€.

 

 

 

끝!