Open Do-hyun-Kim opened 9 months ago
코드를 하나의 블럭으로 모아놓은 것을 의미한다.
named closure: func
키워드로 시작해서 뒤에 이름이 붙는 클로저를 named closure라 하며 일반적으로 함수라고 부른다.
func namedClosure(someValue: SomeType) -> ReturnType {
...
}
unnamed closure: func
키워드 없이 매개변수와 리턴타입을 정의하는 헤더부분과 구현부인 바디부분 이루어졌으며, 일반적으로 클로저라 부른다.
var unnamedClosure: (SomeType) -> ReturnType = { someValue -> String in
...
return returnValue
}
non-escaping: 함수의 매개변수로 클로저를 받을 때는 기본적으로 non-escaping
으로 설정이 되어 있다. non-escaping
클로저는 함수 내부에서의 호출이 보장되기 때문에 클로저에 대한 메모리 관리를 효율적으로 할 수 있다.
escaping: 반면에 escaping
클로저는 함수 외부에서도 사용이 될 수 있다. iOS는 이러한 escaping
클로저의 메모리를 추적해야 하기 때문에 퍼포먼스에 영향을 준다. 클로저는 외부 변수를 참조할 때 기본적으로 strong
방식으로 캡처하기 때문에, 강한 참조 사이클이 발생할 수가 있어서 weak
이나 unowned
방식으로 캡처할 수 있도록 하여 memory leak 상황을 방지할 수 있다.
Closure에 대하여 설명하시오.
closure
사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호{} 로 구분된 코드의 블럭 이다.closure
는 참조 타입이며 함수는 클로져의 한 형태이기도 하다.Closure의 표현 방식
Closure의 종류
탈출(Escaping) 클로저
를 사용하기 위해서는@escaping
키워드를 사용하여야 한다.탈출(Escaping) 클로저
내부에서는 해당 타입의 프로퍼티, 메서드, 서브스크립트 등에 접근하려면self
키워드를 명시적으로 사용해야한다.[weak self]
혹은[unowned self]
키워드를 사용하여 순환 참조 발생을 막아야 한다.self
키워드 선택사항으로 제공해준다.Closure와 함수와의 관계