[swift] unowned 참조와 클로저 캡처 리스트

이번 글에서는 Swift에서 사용되는 unowned 키워드와 클로저 캡처 리스트에 대해 알아보겠습니다.

unowned 참조

unowned 키워드는 강한 참조와 유사한 역할을 하지만, 참조 대상이 메모리에서 해제될 경우 자동으로 nil로 초기화되지 않는다는 점에서 차이가 있습니다. 이는 참조 대상이 반드시 메모리에 남아있는 것을 보장받아야 할 때 주로 사용됩니다.

class Person {
    let name: String
    unowned let spouse: Person

    init(name: String, spouse: Person) {
        self.name = name
        self.spouse = spouse
    }
}

위 예시에서는 Person 클래스의 인스턴스가 생성될 때 spouse 속성이 unowned로 선언되어 다른 Person 인스턴스를 가리키도록 합니다. 이 경우에는 spouse가 메모리에서 해제되더라도 해당 Person 인스턴스는 메모리에 유지되기 때문에 문제가 발생하지 않습니다.

클로저 캡처 리스트

클로저에서 사용되는 상수, 변수, 그리고 self와 같은 참조 타입 변수들에 대한 캡처 방식을 정의하는 문법입니다. 클로저 캡처 리스트는 다음과 같이 작성됩니다.

{ [captureList] (parameters) -> returnType in
    statements
}

예를 들어, 클로저 내에서 self를 약한 참조로 캡처하고자 할 때는 다음과 같이 작성할 수 있습니다.

lazy var someProperty: SomeType = {
    [unowned self] in
    // 클로저 내에서 self 사용
    return someValue
}

클로저 캡처 리스트를 사용함으로써 메모리 누수를 방지하고 클로저 실행 환경을 명확히 정의할 수 있습니다.

더 많은 정보는 Apple 공식 문서에서 확인할 수 있습니다.

이상으로 unowned 참조와 클로저 캡처 리스트에 대해 알아보았습니다. 감사합니다.