ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Closure Capture List - Memory
    iOS/🟠 Swift 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으둜 μΊ‘μ²˜ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ•½ν•œ μ°Έμ‘°λŠ” μ˜΅μ…”λ„ νƒ€μž…μž…λ‹ˆλ‹€.

     

     

     

    끝!


     

     

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜