[TIL] 클로저 심화

Eden·2025년 5월 30일

🔁 Escaping 클로저

  • 클로저가 함수 실행이 끝난 뒤에도 실행될 수 있는 경우 @escaping 키워드 사용.
  • 주로 비동기 작업, 콜백 함수에서 사용됨.
func asyncTask(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        completion()
    }
}

🎯 클로저 캡처

클로저는 자신이 선언된 스코프의 변수/상수 값을 캡처(기억) 함.
캡처된 변수는 클로저가 유지되는 동안 메모리에 유지됨.

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

🧠 캡처 리스트 (Capture List)

클로저가 캡처할 값을 명시적으로 제어.
주로 강한 참조 순환(메모리 누수) 방지를 위해 weak self, unowned self 사용.

class ViewModel {
    var onUpdate: (() -> Void)?

    func bind() {
        onUpdate = { [weak self] in
            self?.reloadUI()
        }
    }
}

✅ 정리

@escaping: 클로저가 함수 스코프 밖에서도 실행될 수 있음.
클로저 캡처: 외부 변수를 기억하여 상태를 유지.
캡처 리스트: 메모리 관리 목적, 캡처 방식을 명시.

profile
iOS Dev

0개의 댓글