본문 바로가기
iOS

[30일차] @escaping 이란?

by 디지털노마더 2020. 8. 28.

Swift3에서는 함수에 클로저를 넘길 때 기본으로 non-escaping으로 지정된다. 

다음과 같이 escaping non-escaping을 살펴보기로 한다.

 

Non-escaping 클로저의 라이프 사이클은 다음과 같다. 

1. 함수에 클로저를 넘긴다.

2. 함수는 클로저를 실행한다. 

3. 함수가 리턴된다.

 

출처 : 파파스머프의 블로그

클로저가 함수의 바디를 탈출하지 않는 것을 살펴본다. 

함수가 종료되었을 때 패스된 클로저는 범위를 벗어나게 되고 클로저에 추가 참조는 더 이상 남아있지 않다. 

 

메모리 관리에 대한 부분을 본자면 참조를 추가하고 해지하는 작업을 기억할 수 있다. 함수가 리턴된 후에 클로저 객체의 참조 카운트는 함수가 호출되기 전과 동일하게 된다.


@escaping 이란 무엇인가?

클로저(Closure)가 함수의 인자로 전달되고 함수 외부에서 실행될 때 함수를 탈출(escape)하는 클로저라고 합니다. 이 클로저는 함수가 반환된 후에 호출됩니다. 함수의 매개변수 타입 앞에 @escaping을 작성하여 해당 클로저가 함수를 탈출할 수 있음을 나타냅니다. (간단 버전)

 

아래와 같은 경우에 escaping 클로저가 실행된다. 

 

1) 비동기 실행(asynchronous execution): 만약 클로저가 디스패치 큐에서 비동기적으로 실행되야 한다면 큐는 클로저를 잡고 있어야 한다. 함수가 리턴되기 전에 실행이 완료될 것이라고 확신할 수 있다면 이 부분이 필요하다. 

2) 저장소(Storage): 전역 변수나 프로퍼티에 클로저를 저장한다. 클로저가 탈출할 수 있도록 함수 호출을 전달해서 살아있도록 저장소에 저장한다.  

 

 

출처 : 파파스머프의 블로그

Swift1, 2에서는 클로저 파라미터는 기본적으로 escaping이었다. 만약에 클로저가 함수 바디를 탈출하지 않는다면 개발자가 @noescape속성을 파라메터 앞에 붙이면 되었다. 

 

Swift3에서는 클로저의 파라미터가 기본이 non-escaping이 되었다. 만약 함수를 탈출한다면 파라메터 앞에 @escaping속성을 붙이면 된다. 만약 클로저가 non-escaping된다면 약간의 잠재적인 최적화가 된다. 클로저가 함수를 탈출하지 않기 때문에 컴파일러는 저장소와 클로저 호출을 최적화할 수 있다.

 

* 인스턴스 메서드와 타입 메서드 차이

 - Instance Method : 인스턴스를 생성한 이후에 내부 메서드를 사용 가능

 - Type Method : 인스턴스를 생성하지 않고 내부 메서드를 바로 사용 가능

댓글