[Swift] Escaping / Non - Escaping Closure

iOSoo·2021년 9월 11일
0
post-thumbnail
post-custom-banner

Escaping : 인자 값으로 전달된 Closure를 저장해두었다가 나중에 다른 곳에서도 실행할 수 있도록 허용해주는 속성

Non - Escaping : Closure가 함수가 종료되기 전에 실행되는 속성

Swift에서 함수의 인자값으로 전달된 Closure는 기본적으로 Non - Escaping의 속성을 가진다. 즉, 직접 호출만 가능하다는 뜻이다.

[Non - Escaping의 의미]

  1. 함수 내에서
  2. 직접 실행을 위해서만 사용

위와 같은 이유로 함수 내부라 할지라도 변수나 상수에 대입할 수 없다.

[Non - Escaping 예시]

  1. Closure가 runClosure() 함수의 closure 인자로 전달됨
  2. 함수 안에서 closure() 가 실행
  3. runClosure() 함수가 값을 반환하고 종료

[인자로 전달되는 Closure의 기본 속성이 Non - Escaping인 이유]

가장 큰 이점은 컴파일러가 코드를 최적화하는 과정에서의 성능향상 때문이다.

해당 Closure가 Non - Escaping이라는 것은 컴파일러가 더 이상 메모리 관리상의 지저분한 일들을 관여할 필요가 없기 때문이다.

Non - Escaping Closure는 컴파일러가 클로저의 실행이 언제 종료되는지 알기 때문에, 때에 따라 클로저에서 사용하는 특정 객체에 대한 retain, release 등의 처리를 생략해 객체의 라이프싸이클(life-cycle)을 효율적으로 관리할 수 있습니다

[Non - Escaping의 주의점]

Non - Escaping Closure 내부에서는 self 키워드를 사용할 수 있다.

[Escaping의 의미]

: 함수의 실행이 종료되기 전에 실행되지 않는다. 즉, 함수 밖에서 실행되는 Closure이다

[Escaping 예시]

  1. 클로저가 fetchData() 함수의 completion 인자로 전달
  2. 클로저 completion이 completionhandler 변수에 저장
  3. fetchData() 함수가 값을 반환하고 종료
  4. 클로저 completion은 아직 실행되지 않음

[참고]

profile
애플을 좋아하는 비전공생
post-custom-banner

0개의 댓글