iOS - Escaping Closure

eslerkang·2022년 6월 25일
0

iOS

목록 보기
2/2
post-thumbnail

Closure

Definition

Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages.
- The Swift Programming Language

클로저란 블록 형태의 함수 객체로, 전달되며 사용(함수의 인자 혹은 반환)되는 것이다. 쉽게 Lambda, Arrow Func와 비슷하다고 생각할 수 있다.

Escaping Closure

Escaping Closure

A closure is said to escape a function when the closure is passed as an argument to the function, but is called after the function returns. When you declare a function that takes a closure as one of its parameters, you can write @escaping before the parameter’s type to indicate that the closure is allowed to escape.
- The Swift Programming Language

클로저가 함수에 인자로 넘겨졌으나, 그 함수가 종료되고(반환되고) 클로저가 실행되면 그것을 Escape 한 것이라고 한다. 즉 이러한 클로저를 Escaping Closure라고 한다. 그리고 Escaping Closure를 인자로 받는 함수를 정의할때 클로저 앞에 @escaping 키워드를 작성한다. @escaping 키워드를 작성한 클로저는 Non-Escaping Closure, Escaping Closure 모두로 사용 가능하지만, 키워드를 작성하지 않고 정의한 클로저는 Non-Escaping Closure로만 사용 가능하다.

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

위의 예시가 간단한 Escaping Clousre에 대한 예시이다.

이러한 Escaping Closure는 비동기로 실행되는 Alamofire 같은 Http Request 등에 사용할 수 있다.

[weak self]

마지막으로 Escaping Closure에서 [weak self]를 통해 self를 옵셔널로 캡쳐하는 것을 볼 수 있다. 이는 강한 순환참조를 막기 위한 것으로, Escaping Closure 특성상 이를 인자로 받은 함수가 끝난 후에 실행되거나 외부에 저장될 수 있기 때문에 strong하게 참조중인 객체(self)를 유지하게 되면 메모리 누수가 발생할 수 있게 된다. 이를 막기 위해 실제 객체를 소유하지 않아 레퍼런스 카운트를 증가시키지 않는 weak 키워드를 통해 약한 참조로 self를 캡쳐하는 것이다.

profile
Surfer surfing on the dynamic flow of the world

0개의 댓글