[Swift] Escaping / Non - Escaping Closure

Escaping : 인자 값으로 전달된 Closure를 저장해두었다가 나중에 다른 곳에서도 실행할 수 있도록 허용해주는 속성
Non - Escaping : Closure가 함수가 종료되기 전에 실행되는 속성
Swift에서 함수의 인자값으로 전달된 Closure는 기본적으로 Non - Escaping의 속성을 가진다. 즉, 직접 호출만 가능하다는 뜻이다.
[Non - Escaping의 의미]
- 함수 내에서
- 직접 실행을 위해서만 사용
위와 같은 이유로 함수 내부라 할지라도 변수나 상수에 대입할 수 없다.
[Non - Escaping 예시]
.png)
- Closure가 runClosure() 함수의 closure 인자로 전달됨
- 함수 안에서 closure() 가 실행됨
- runClosure() 함수가 값을 반환하고 종료됨
[인자로 전달되는 Closure의 기본 속성이 Non - Escaping인 이유]
가장 큰 이점은 컴파일러가 코드를 최적화하는 과정에서의 성능향상 때문이다.
해당 Closure가 Non - Escaping이라는 것은 컴파일러가 더 이상 메모리 관리상의 지저분한 일들을 관여할 필요가 없기 때문이다.
Non - Escaping Closure는 컴파일러가 클로저의 실행이 언제 종료되는지 알기 때문에, 때에 따라 클로저에서 사용하는 특정 객체에 대한 retain, release 등의 처리를 생략해 객체의 라이프싸이클(life-cycle)을 효율적으로 관리할 수 있습니다
[Non - Escaping의 주의점]
Non - Escaping Closure 내부에서는 self 키워드를 사용할 수 있다.
[Escaping의 의미]
: 함수의 실행이 종료되기 전에 실행되지 않는다. 즉, 함수 밖에서 실행되는 Closure이다
[Escaping 예시]
.png)
- 클로저가 fetchData() 함수의 completion 인자로 전달됨
- 클로저 completion이 completionhandler 변수에 저장됨
- fetchData() 함수가 값을 반환하고 종료됨
- 클로저 completion은 아직 실행되지 않음
[참고]