@escaping 키워드 사용.func asyncTask(completion: @escaping () -> Void) {
DispatchQueue.global().async {
completion()
}
}
클로저는 자신이 선언된 스코프의 변수/상수 값을 캡처(기억) 함.
캡처된 변수는 클로저가 유지되는 동안 메모리에 유지됨.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
클로저가 캡처할 값을 명시적으로 제어.
주로 강한 참조 순환(메모리 누수) 방지를 위해 weak self, unowned self 사용.
class ViewModel {
var onUpdate: (() -> Void)?
func bind() {
onUpdate = { [weak self] in
self?.reloadUI()
}
}
}
@escaping: 클로저가 함수 스코프 밖에서도 실행될 수 있음.
클로저 캡처: 외부 변수를 기억하여 상태를 유지.
캡처 리스트: 메모리 관리 목적, 캡처 방식을 명시.