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 : 인스턴스를 생성하지 않고 내부 메서드를 바로 사용 가능
'iOS' 카테고리의 다른 글
[32일차] Animation은 왜 사용하는 것인가? (0) | 2020.09.15 |
---|---|
[31일차] @IBAction과 @IBOutlet은 무엇인가? (0) | 2020.09.04 |
[29일차] Protocol이란? (0) | 2020.08.27 |
[28일차] SearchBar와 키보드 숨김 처리 (0) | 2020.08.22 |
[27일차] Codable 이란? (0) | 2020.08.19 |
댓글