클로져 탈출 (Closure Escape)


클로저 사용법을 익히는 중에 만나는 어노테이션같이 생긴 @escaping 에 대한 내용이다.



Swift 4 기준에서, 클로져의 기본옵션값인 non-escape 옵션의 경우,


펑션이 종료됨에 따라 클로져의 생명주기도 끝을 다하게 된다.


클로져를 단순히 파라미터로 사용하고 펑션이 종료되면 그대로 메모리 등을 정리하는 방식.





@escaping 을 사용하면..


1
2
3
4
5
6
7
8
9
10
func requestString(success: @escaping(_ tag: String, _ data: String?)-> Void, fail: @escaping (_ tag: String, _ error: Error?)-> Void) {
        Alamofire.request(url, method: method, parameters: parameters).responseString { response in
            if response.result.isSuccess {
                success(self.tag, response.result.value)
            } else {
                fail(self.tag, response.result.error)
            }
        }
    }
 
cs


클로져 사용 시 @escaping을 붙인 이 파라미터는, 클로저가 파라미터로 전달되지만, 함수가 종료된 이후에 실행됨을 의미한다고 한다.


즉, requestString 펑션이 종료된 상황에서 success 클로져에 담기는 파라미터들 역시 생명주기를 다하는 것이 아닌,


로컬 변수가 펑션을 뛰어넘어 전달될 수 있음을 의미한다.


아마도 alamofire 등, 비동기식의 전달이 필요한 경우에 상당히 유용할 것 같다.

이 글을 공유하기


댓글(0)

Designed by CMSFactory.NET