ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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을 올렸기 때문에 메모리에서 해제되지 않는다. 

Designed by Tistory.