728x90
캡처리스트 (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가 실행될 때 사용된다.
- closure는 기본적으로 Value Type, Reference Type 둘 다 Reference Capture를 한다.
- 캡처리스트를 통한 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
'Swift' 카테고리의 다른 글
[Swift] deinit에서 self에 접근해도 되는가? (0) | 2022.06.02 |
---|---|
[Swift] closure에서 self를 써야하는 이유 (0) | 2022.05.16 |
[Swift] closure 내부의 weak self 사용 (0) | 2022.04.03 |
[Swift] allSatisfy(_:) (0) | 2022.03.28 |
[Swift] Extension에 storedProperty 선언하기 (0) | 2022.03.26 |
댓글