[swift] strong reference cycle 해결 방법

강한 참조 순환은 두 개 이상의 객체가 서로를 강하게 참조하여 해제되지 않는 메모리 누수를 일으키는 문제입니다. Swift에서는 weak 또는 unowned 키워드를 사용하여 이 문제를 해결할 수 있습니다.

weak 참조

weak 키워드를 사용하면, 해당 참조가 해제될 때 자동으로 nil로 설정됩니다. 이는 weak 참조가 참조하는 객체가 메모리에서 해제될 경우, 자동으로 더 이상 참조 대상이 없다는 것을 나타내게 됩니다.

예를 들어, 다음은 weak 참조를 사용하여 강한 참조 순환이 발생하지 않도록 하는 예시입니다.

class Person {
    var dog: Dog?
}

class Dog {
    weak var owner: Person?
}

unowned 참조

unowned 키워드를 사용하여 더는 참조할 객체가 없음을 나타낼 수 있습니다. 하지만, unowned 참조는 weak 참조와 다르게 항상 값을 가지고 있어야 합니다. 따라서, 만일 참조하던 객체가 해제된 상태에서 unowned 참조를 사용하게 되면 런타임 에러가 발생합니다.

예를 들어, 다음은 unowned 참조를 사용하여 강한 참조 순환이 발생하지 않도록 하는 예시입니다.

class Customer {
    let card: CreditCard
    unowned let merchant: Merchant

    init(card: CreditCard, merchant: Merchant) {
        self.card = card
        self.merchant = merchant
    }
}

class CreditCard {}

class Merchant {}

요약

weakunowned 참조를 올바르게 사용하면, 강한 참조 순환이 발생하는 문제를 해결할 수 있습니다. 그러나 이 두 방법 모두 사용 시 올바른 상황에서 사용해야 하며, 잘못된 사용으로 인한 런타임 에러나 메모리 누수를 방지하기 위해 신중하게 사용해야 합니다.

많은 Swift 프로그래머들이 이러한 문제를 피하기 위해 항상 weak 또는 unowned 참조를 사용하여, 메모리 누수를 방지하고 안정성을 향상시키고 있습니다.

참고 자료