λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
iOS 🍎/Swift

Non-Escaping Closure 와 Escaping Closure

by yongmin.Lee 2021. 12. 28.

 

 

Non-Escaping ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ˜ 인자둜 전달됐을 λ•Œ, ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλ˜κΈ° 전에 μ‹€ν–‰λ˜λŠ” ν΄λ‘œμ €.

Escaping ν΄λ‘œμ €λŠ” ν΄λ‘œμ €κ°€ ν•¨μˆ˜μ˜ 인자둜 전달됐을 λ•Œ, ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ ν›„ μ‹€ν–‰λ˜λŠ” ν΄λ‘œμ €.

 

Non-Escaping ν΄λ‘œμ €

func runClosure(closure: () -> Void) {
 closure()
}

ν΄λ‘œμ €κ°€ μ‹€ν–‰λ˜λŠ” μˆœμ„œλ₯Ό 보면

  1. ν΄λ‘œμ €κ°€ runClosure() ν•¨μˆ˜μ˜ closure μΈμžλ‘œ 전달됨
  2. ν•¨μˆ˜ μ•ˆμ—μ„œ closure() κ°€ 싀행됨
  3. runClosure() ν•¨μˆ˜κ°€ 값을 λ°˜ν™˜ν•˜κ³  μ’…λ£Œλ¨

μ΄λ ‡κ²Œ ν΄λ‘œμ €κ°€ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜κΈ° 전에 μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— closureλŠ” Non-Escaping ν΄λ‘œμ €μ΄λ‹€.

 

Escaping ν΄λ‘œμ €

func makeRequest(_ completion: @escaping (Result<(Data, URLResponse), Error>) -> Void) {
  URLSession.shared.dataTask(with: URL(string: "http://jusung.github.io/")!) { data, response, error in
    if let error = error {
      completion(.failure(error))
    } else if let data = data, let response = response {
      completion(.success((data, response)))
    }
  }
}

makeRequest() ν•¨μˆ˜μ—μ„œ μ‚¬μš©λ˜λŠ” completion ν΄λ‘œμ €λŠ” ν•¨μˆ˜ μ‹€ν–‰ 쀑에 μ¦‰μ‹œ μ‹€ν–‰λ˜μ§€ μ•Šκ³ , URL μš”μ²­μ΄ λλ‚œ ν›„ λΉ„λ™κΈ°λ‘œ μ‹€ν–‰λœλ‹€.

보톡 ν΄λ‘œμ €κ°€ λ‹€λ₯Έ λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ λ‚˜μ€‘μ— μ‹€ν–‰λ˜κ±°λ‚˜ λΉ„λ™κΈ°λ‘œ 싀행될 λ•Œ escaping ν΄λ‘œμ €κ°€ μ‚¬μš©λœλ‹€.

 

Escaping, Non-escaping ν΄λ‘œμ €λ₯Ό λ‚˜λˆ μ„œ μ‚¬μš©ν•˜λŠ” 이유

  • non-escaping ν΄λ‘œμ €λŠ” μ»΄νŒŒμΌλŸ¬κ°€ ν΄λ‘œμ €μ˜ 싀행이 μ–Έμ œ μ’…λ£Œλ˜λŠ”μ§€ μ•ŒκΈ° λ•Œλ¬Έμ—, λ•Œμ— 따라 ν΄λ‘œμ €μ—μ„œ μ‚¬μš©ν•˜λŠ” νŠΉμ • 객체에 λŒ€ν•œ retain, release λ“±μ˜ 처리λ₯Ό μƒλž΅ν•΄ 객체의 라이프싸이클(life-cycle)을 효율적으둜 관리할 수 μžˆλ‹€.
  • esacping ν΄λ‘œμ €λŠ” ν•¨μˆ˜ λ°–μ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— ν΄λ‘œμ €κ°€ ν•¨μˆ˜ λ°–μ—μ„œλ„ 적절히 μ‹€ν–‰λ˜λŠ” 것을 보μž₯ν•˜κΈ° μœ„ν•΄, ν΄λ‘œμ €μ—μ„œ μ‚¬μš©ν•˜λŠ” 객체에 λŒ€ν•œ 좔가적인 참쑰싸이클(reference cycles) 관리 등을 ν•΄μ€˜μ•Ό ν•œλ‹€. 이 뢀뢄이 컴파일러의 νΌν¬λ¨ΌμŠ€μ™€ μ΅œμ ν™”μ— 영ν–₯을 끼치기 λ•Œλ¬Έμ— Swiftμ—μ„œλŠ” ν•„μš”ν•  λ•Œλ§Œ escaping ν΄λ‘œμ €λ₯Ό μ‚¬μš©.

 

 

 

μ°Έκ³ 

https://stackoverflow.com/questions/52879202/does-objective-c-have-an-equivalent-to-swifts-escaping-annotation

https://jusung.github.io/Escaping-Closure/

'iOS 🍎 > Swift' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

RxSwift Operator : Map, FlatMap  (0) 2022.04.18
typealias, associatedtype  (0) 2022.04.15
μ ‘κ·Όμ œμ–΄, Access control  (0) 2021.12.28
Method Dispatch  (0) 2021.12.06
KVO, Key-Value Observing  (0) 2021.12.06