본문 바로가기
카테고리 없음

[Swift] Caputre List 관련 사이트 정리

by 정석 지향 2023. 2. 28.
반응형

캡처리스트 관련 공부 시 도움 되었던 사이틀를 정리해봤습니다.

 

https://babbab2.tistory.com/83

 

Swift) 클로저(Closure) 정복하기(3/3) - 클로저와 ARC

안녕하세요 :) 소들입니다! 이번 포스팅은 클로저 정복하기 마지막 편!!! 메모리나 ARC에 대한 사전 지식이 없으면 조금 이해하기 어려울 수 있으니, 메모리 관련 포스팅을 먼저 보고 오심을 추천

babbab2.tistory.com

 

https://velog.io/@kimdo2297/%ED%81%B4%EB%A1%9C%EC%A0%B8-%EC%BA%A1%EC%B3%90%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-about-closure-capture

 

클로저 캡쳐에 대해서 (about closure capture)

출처 : <https://docs.swift.org/swift-book/LanguageGuide/Closures.html클로저 캡쳐란? 클로저 캡쳐란 매개변수나 지역변수가 아닌 주변 외부의 context를 사용하기 위해 주변 외부의 context를 참조하

velog.io

 

https://showcove.medium.com/swift-closure-capture-lists-1-277d2e60dc2d

 

 

정리

Capture List을 사용하면 캡쳐된 변수는 클로저가 생성되는 시점에 평가되어집니다.

Captured variables are evaluated on execution : 캡쳐된 변수는 클로저가 실행될  평가되어집니다.

아래와 같은 경우 self는 먼저 deinit된 후 “—“를 출력한다
{ [weak self] _ in
            //guard let `self` = weak_self else { return } 
            
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
                print("5초 후 실행")
                let category_text = self?.lbl_category.text ?? "--"
                print("텍스트: \(category_text)")
            })
}

guard let으로 self를 다시 한 번 강하게 참조하게되므로 아래 5초후 로직이 끝난 후에야 self가 deint된다
{ [weak self] _ in
            guard let `self` = weak_self else { return } 
            
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
                print("5초 후 실행")
                let category_text = self?.lbl_category.text ?? "--"
                print("텍스트: \(category_text)")
            })
}

print("참조수 확인: \(CFGetRetainCount(self))")
반응형