클로저에서는 weak와 unowned를 통해 강한 참조 사이클(Strong Reference Cycle) 문제를 해결한다.
캡처현상이란 클로저를 변수에 할당 혹은 클로저를 호출하는 순간, 지속적으로 외부 변수를 사용해야 하는 클로저가 자신이 참조하는 외부 변수를 캡처하는 현상을 의미한다.
func calculate(number: Int) -> Int {
var sum = 0
func square(num: Int) -> Int {
sum += (num * num)
return sum
}
let result = square(num: number)
return result
}
calculate(number: 10) // 100
calculate(number: 20) // 400
calculate(number: 30) // 900
func calculateFunc() -> ((Int) -> Int) {
var sum = 0
func square(num: Int) -> Int {
sum += (num * num)
return sum
}
return square
}
var squareFunc = calculateFunc()
squareFunc(10) // 100
squareFunc(20) // 500
squareFunc(30) // 1400
위 두 코드를 비교해 보면, 똑같이 함수를 정의했지만 결과값을 리턴하는 부분이 다르다.
첫번째 코드는 결과값을 리턴하고, 두번째 코드는 함수를 리턴한다. 이렇게 함수를 변수에 담으면 클로저와 동일한 현상이 발생하게 된다.
이 함수에서 필요한 외부 변수인 sum을 사용하는 경우, calculateFunc를 벗어나더라도 square는 계속 sum을 사용해야 하기 때문이다.
이러한 캡처현상을 해결할 수 있는 방법이 바로 캡처리스트이다.