본문 바로가기

면접질문정리/Swift문법

[ing] Closure 값 캡쳐를 사용하는 이유(ex async와 sync)

주로 고차함수나 비동기작업하는데 클로저를 많이 사용하는데
클로저를 통해 비동기 콜백을 작성할때 현재 상태를 미리획득해두지않으면

실제로 클로저의 기능을 실행하는 순간에는 변수가 nil인상태이거나 메모리에 존재하지않는 경우가 발생할 수 있다.

이때. 필요한 것이바로 클로저의 값 캡쳐기능이다.

 

우리가 구조체 메서드내 dispatchQueue.global().sync메서드내에서 다른 타입의 변수를 호출하면 에러가 발생하지않음

왜?

main thread가 진행될동안 다른 thread에 rock이 걸리기때문에 현재 클로저내에서 값을 바꾸는 것외에는 다른스레드를 통해 바뀔일이 없다.

 

그런데 async를 선언하면 이와같은에러메세지가 발생한다.

“Escaping closure captures mutating ‘self’ parameter” 라는 에러메세지가 나온다.

이는 추측해보기론 현재 클로저내에있는 스레드 외에서도 다른 스레드를 생성하여 값을 바꿀 여지가 존재한다.

그렇기떄문에 갑을 캡쳐하지않으면 다른 스레드도 동시에 작업을 하기떄문에 값이 변경될 수도 있따.

 

이렇게되면 프로퍼티가 async진행 중에 nil이되거나 메모리에서 해제된 상태에서 접근하게되면 어떻게될까 ??
앱이 죽을 수 있다. 고로 앱이 죽지않고 안전하게 작업하기위해서 값을 캡쳐해서 사용하는것이다.

 

그래서 현재 상태의 값을 캡쳐하여 캡쳐한 기준으로 앱이 실행되는동안 사용되는 것이다.

그래서 프로퍼티의 값을 초기화하지않는한 앱이실행되는동안에는 프로퍼티의 값이 변경되도 계속 유지가 된다.