[swift] unowned 참조의 활용

Swift에서 참조 사이클(reference cycle)은 메모리 누수를 초래할 수 있는 문제 중 하나입니다. 이런 문제를 해결하기 위해 unowned 키워드를 사용할 수 있습니다. unowned 참조는 일반적으로 참조 해제되지 않을 것으로 확신할 수 있는 경우에 사용됩니다. 주로 다음 두가지 경우에 활용됩니다.

1. 클로저에서의 강한 참조 사이클 해결

클로저 내에서 self에 대한 강한 참조를 방지하기 위해 unowned 참조를 활용할 수 있습니다.

class ViewController {
    var closure: (() -> Void)?

    func setupClosure() {
        self.closure = { [unowned self] in
            self.doSomething()
        }
    }

    func doSomething() {
        // Some action
    }
}

2. 강한 참조 순환을 피하기 위한 서브클래스에서의 사용

서브클래스에서 부모클래스의 인스턴스에 대한 참조를 갖는 경우, 강한 참조 순환을 방지하기 위해 unowned 참조를 사용할 수 있습니다.

class Parent {
    unowned let child: Child
    
    init(child: Child) {
        self.child = child
    }
}

class Child {
    let parent: Parent
    
    init(parent: Parent) {
        self.parent = parent
    }
}

unowned 참조는 nil이 될 수 있는 경우에는 사용해서는 안 됩니다. 이러한 경우에는 weak 참조를 사용해야 합니다.

unowned 참조를 사용함으로써 강한 참조 순환 문제를 효과적으로 해결할 수 있습니다. 그러나 주의해서 사용해야 하며, 참조가 항상 해제되어 있을 것이라는 확신이 있을 때만 사용해야 합니다.

참조: Swift 공식 문서 - Automatic Reference Counting


Unsplash에서 Curtis MacNewton이 제공한 이미지 사용. https://unsplash.com/photos/nIx0WDzHLFE