-
swift 클로저 - 캡처리스트 (:클래스에서의 사용)Swift/swift 문법 2023. 9. 6. 00:01
클로저는 참조타입이다.
클로저 내부에서 외부의 값을 불러올 때 '캡쳐현상'이 발생한다.
이떄 클로저 안에서 이용되는 외부의 변수를 캡쳐리스트 안에 넣어줄 수 있다.
캡쳐 리스트를 써서 대상을 캡쳐할 수 있는데, 캡쳐한 대상의 타입에 따라 그 방법이 달라진다.
캡처된 대상 캡쳐리스트 유무 결과 구조체 캡처리스트를 쓰지 않은경우 외부 값이 변하면 같이 변한다 캡처리스트를 쓴 경우 외부 값이 변해도 변하지 않음 값 캡처리스트를 쓰지 않은경우 주소값 복사 캡처리스트를 쓴 경우 주소값 복사 (RC를 올려서 메모리에서 해제될 가능성을 방지) 이중 값 타입의 코드 예시
// 클래스의 캡처리스트 class SomeClass { var num = 1 deinit{ print("메모리에서 해제되었습니다.") } } var x: SomeClass? = SomeClass() let capture = { print("capture 출력: \(x?.num)") } capture() x = nil capture() var y: SomeClass? = SomeClass() let capture2 = {[y] in print("capture2 출력: \(y?.num)") } capture2() y = nil capture2()
capture 출력: Optional(1)
메모리에서 해제되었습니다.
capture 출력: nil
capture2 출력: Optional(1)
capture2 출력: Optional(1)
nil을 할당해도 캡처리스트를 통해 Reference Counting을 올렸기 때문에 메모리에서 해제되지 않는다.
'Swift > swift 문법' 카테고리의 다른 글
[Swift] Computed Property - get/set (1) 2024.01.03 Defer 문 (0) 2023.06.05 열거형 - 연관값, 열거형 (0) 2023.06.05 as 연산자 / is 연산자 (0) 2023.05.26 Protocol의 메모리 주소와 프로토콜의 확장 구현시 실행 메서드 (0) 2023.05.13