[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