본문 바로가기
Swift

[Swift] 캡처리스트 (Capture List)

by Sky Titan 2022. 4. 5.
728x90
 

Closure - Capture List

주변 환경의 범위에서 참조한 변수들을 얼마나 강하게 캡쳐해야하는지를 명시하는 것으로, 캡쳐리스트를 사용하여 메모리 누수를 일으키는 강한 참조 순환을 피할 수 있게 된다.캡쳐리스트는

velog.io

 

 

Swift) 클로저(Closure) 정복하기(3/3) - 클로저와 ARC

안녕하세요 :) 소들입니다! 이번 포스팅은 클로저 정복하기 마지막 편!!! 메모리나 ARC에 대한 사전 지식이 없으면 조금 이해하기 어려울 수 있으니, 메모리 관련 포스팅을 먼저 보고 오심을 추천

babbab2.tistory.com

캡처리스트 (Capture List)

  • closure 안에서 외부의 변수들을 캡처할 때 strong, weak, unowneded 등의 참조 강도를 명시해서 캡처해오는 방법이다.
  • closure 안에서 retain cycle을 위해서 주로 사용된다.
  • 캡처리스트를 통한 value 타입 캡처
    • closure는 기본적으로 Value Type, Reference Type 둘 다 Reference Capture를 한다.
      • Value Type이더라도 원본 값이 변하면 클로저 내부의 값도 변한다.
    • 캡처리스트를 통해 value타입을 캡처하면 Reference Capture를 하지 않고 closure가 생성될 때 값을 복사해서 캡처된다.
    • 즉, closure가 생성될 때의 값을 계속 유지하고 있다가 closure가 실행될 때 사용된다.
  • 캡처리스트를 통한 reference 타입 캡처
    • closure가 실행될 때 캡처된다.
    • closure가 생성될 때와, 실행될 때의 값이 달라질 수 있다. (즉, 캡처리스트를 통해 캡처해도 Reference Capture를 한다.)
    • ARC가 메모리를 관리하기 때문에 retain cycle을 방지하기 위해 참조 강도를 명시할 필요가 있을 때 캡처리스트를 통해 캡처한다.

 

value 타입을 캡처리스트에 캡처하지않은 경우

import Foundation

var closure: () -> Void = {}
var value: Int = 0

for _ in 0 ..< 5 {
    value += 1
    if value == 3 {
        closure = {
            print("index: \(value)")
        }
    }
}


closure()
/*
 index: 5
 */

 value가 3일 때 closure에서 캡처했지만 마지막으로 할당된 값 5가 출력된다.

 

value 타입을 캡처리스트에 캡처한 경우

import Foundation

var closure: () -> Void = {}
var value: Int = 0

for _ in 0 ..< 5 {
    value += 1
    if value == 3 {
        closure = { [value] in
            print("index: \(value)")
        }
    }
}


closure()
/*
 index: 3
 */

closure가 생성될 당시의 값 3을 출력한다.

728x90

댓글